有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    我终于想出了解决自己问题的办法

    default <F extends T> AndFilter<F> and(Filter<? super F> other){
        return new AndFilter<>(this, other);
    }
    

    必须给出函数自己的泛型(F),它至少是当前过滤器的类型,然后另一个过滤器最多只能是该类型。返回并将筛选器参数化为该类型