使用泛型 class 层次结构时出现编译错误

Compile error on using generics class hierarchy

我在 Java 7.

中使用泛型(抽象)class 层次结构时遇到类型推断问题

类别 class 是一个 接口

public interface Category {
    void foo();
}

public abstract class CategoryFilter<E extends Category, T>{

    private E category;

    private Set<T> values = new HashSet<T>();

    public E getCategory() {
        return category;
    }
    public void setCategory(E category) {
        this.category = category;
    }
    public void setValues(Set<T> values) {
        this.values = values;
    }

    public Set<T> getValues() {
        return values;
    }
}

SubCategory 实现了 Category 并且有一个特定的方法 bar().

public class SubCategory implements Category {

    @Override
    public void foo() {

    }

    public void bar(){

    }
}


public abstract class SubCategoryFilter<Q extends SubCategory, T> extends CategoryFilter<Q,T>{

    /*public Q getCategory() {
         return category;
    }*/

    public void buzz(){

    }

}

每个 ConcreteClassX 扩展 SubCategory.

public final class ConcreteCategoryFilter1 extends SubCategoryFilter<ConcreteClass1, String> {}
public final class ConcreteCategoryFilter2 extends SubCategoryFilter<ConcreteClass2, Integer> {}

我不想在这里解释真正的业务逻辑。

假设我有一个 SubCategoryFilter l 列表,我想在该列表的每个元素上应用 bar() 而无需转换

List<SubCategoryFilter> l = ...;
SubCategory sub = l.get(0).getCategory(); // here IDE tells me that the return type is Category and not SubCategory
sub.bar();

编译失败不兼容的类型
[错误] 需要:com.xxx.yyy.SubCategory
[错误] 发现:com.xxx.yyy.Category

如果我取消注释前面的方法,一切都很好。

为什么我必须取消注释之前的 valueless 覆盖 getter getCategory() 才能编译?


Java 版本“1.7.0_79” Java(TM) SE 运行时环境(build 1.7.0_79-b15) Java HotSpot(TM) 64 位服务器 VM(内部版本 24.79-b02,混合模式)

List<SubCategoryFilter> list 是原始类型,因为 SubCategoryFilter 是泛型 class 并且您没有在变量声明中为其指定任何泛型。

声明泛型类型:

List<SubCategoryFilter<SubCategory, ?>> filters = ....

getCategory() 可以 return 一个 SubCategory 类型 :

SubCategory sub = filters.get(0).getCategory();