使用泛型 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();
我在 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();