gpt4 book ai didi

java - 使用泛型类层次结构时出现编译错误

转载 作者:行者123 更新时间:2023-12-02 12:32:26 25 4
gpt4 key购买 nike

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

类别类是一个接口(interface)

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 运行时环境(版本 1.7.0_79-b15)Java HotSpot(TM) 64 位服务器 VM(内部版本 24.79-b02,混合模式)

最佳答案

List<SubCategoryFilter> list是原始类型 SubCategoryFilter是一个泛型类,您无需在变量声明中为其指定任何泛型。

声明泛型类型:

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

getCategory()可以返回 SubCategory类型:

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

关于java - 使用泛型类层次结构时出现编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45242828/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com