我对泛型有问题。
我有一个SuperType和两个SubTypes。类结构如下:
class SuperType {}
class FirstSubType extends SuperType {}
class SecondSubType extends SuperType {}
然后我用一种方法创建TypedClass:
abstract class TypedClass<T extends SuperType> {
protected abstract String getStatus(T o);
}
我尝试将它用作匿名类:一个用于FisrtSubType,另一个用于SecondSubType:
new TypedClass<FirstSubType>() {
@Override
protected String getStatus(FirstSubType o) {
return "FirstSubType";
}
};
和
new TypedClass<SecondSubType>() {
@Override
protected String getStatus(SecondSubType o) {
return "SecondSubType";
}
};
我尝试将theese对象保存在变量类型中:
TypedClass<? extends SuperType> typedClass;
当我获得SuperType的对象并尝试使用该对象作为参数调用getStatus时,我收到错误:? extends SuperType不能应用于SuperType。
代码如下:
private void go(SuperType superTypeObj, String strT) {
TypedClass<? extends SuperType> typedClass = getTypedClass(strT);
String status = typedClass.getStatus(superTypeObj);
System.out.println(status);
}
上述方法的代码在第二行中进行破解(使用superTypeObj作为参数调用getStatus)。
方法getTypedClass(String strT)
返回TypedClass<? extends SuperType>
并创建TypedClass<FirstSubType>
或TypedClass<SecondSubType>
,具体取决于String参数(strT):
private TypedClass<? extends SuperType> getTypedClass(String strType) {
TypedClass<? extends SuperType> res = null;
if ("FirstSubType".equals(strType)) {
res = new TypedClass<FirstSubType>() {
@Override
protected String getStatus(FirstSubType o) {
return "FirstSubType";
}
};
} else {
res = new TypedClass<SecondSubType>() {
@Override
protected String getStatus(SecondSubType o) {
return "SecondSubType";
}
};
}
return res;
}