使用泛型类层次结构时编译错误

时间:2017-07-21 16:47:45

标签: java generics inheritance type-erasure

我在Java 7中使用泛型(抽象)类层次结构时遇到类型推断问题。

类别类是界面

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

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

为什么我必须取消注释以前的​​无值重写的getter getCategory()才能编译?

Java版本&#34; 1.7.0_79&#34; Java(TM)SE运行时环境(版本1.7.0_79-b15) Java HotSpot(TM)64位服务器VM(内置24.79-b02,混合模式)

1 个答案:

答案 0 :(得分:1)

def btnPressed(index): for btn in buttons: if str(btn['state']) == 'disabled': btn.configure(state = 'normal') buttons[index].configure(state = 'disabled') 是原始类型,因为List<SubCategoryFilter> list是一个通用类,您不必在变量声明中为其指定任何通用。

声明泛型类型:

SubCategoryFilter

List<SubCategoryFilter<SubCategory, ?>> filters = .... 可以返回getCategory()类型:

SubCategory