Java泛型返回泛型参数化为更具体的两种类型?
我目前有一个项目,我正在使用一组实现泛型Filter<T extends Entity>
类的类来过滤一些实体,其中T是特定过滤器将处理的最具体的实体。一直在创建新实例有点冗长,所以我还构建了一个生成器。一切都很好,但现在我正在尝试将AndFilter添加到生成器中
以下是我的AndFilter的外观
public class AndFilter<T extends Entity> implements Filter<T>{
private Filter<? super T> a;
private Filter<? super T> b;
public AndFilter(Filter<? super T> a, Filter<? super T> b){
this.a = a;
this.b = b;
}
@Override
public boolean shouldInclude(T entity) {
return a.shouldInclude(entity) && b.shouldInclude(entity);
}
}
下面是我一直在尝试使用的构建函数(我的构建器只是过滤器界面中的默认函数)
public interface Filter<T extends Entity> {
boolean shouldInclude(T entity);
default AndFilter and(Filter<? extends Entity> other){
return new AndFilter<>(this, other);
}
default Filter<T> not(){
return new NotFilter<>(this);
}
}
我需要能够参数化and()的返回,但我所做的所有尝试都失败了。理论上,AndFilter应该被参数化为这个或那个的类型,以更具体的为准,但我不知道如何做到这一点,我开始认为这根本不可能。如果不是的话,对于我可以实现类似行为的其他方法(不必调用new AndFilter<;>;(x,y)来比较两个过滤器)的任何建议,我都将不胜感激
编辑:我有许多从实体继承的类,它们都有自己的私有属性
实体->;动物->;捕食者,格拉佐
实体->;障碍物
实体->;种植
所以我有一个DistanceFilter实现过滤器(因为所有实体都有位置,所以有距离),但我也有侵略过滤器实现过滤器,因为只有捕食者具有侵略性。检查捕食者是否满足这两个过滤器应该是可能的,因为捕食者拥有所有必需的属性,而且它确实有效。我可以打电话给new and Filter<>;(new distance filter(),new acgression filter())它工作得很好,但是当我试图将初始化放在函数后面时,我无法让返回类型工作
# 1 楼答案
我终于想出了解决自己问题的办法
必须给出函数自己的泛型(F),它至少是当前过滤器的类型,然后另一个过滤器最多只能是该类型。返回并将筛选器参数化为该类型