我在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,混合模式)
答案 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