任何人都可以解释为什么在子类中使用类型为List<>
的元素时会强制转换为Object
吗?
仅当父类使用泛型时,才会发生这种情况。
在某种程度上,该类的type
会干扰实例字段的type
。
public abstract class Parent<T> {
protected List<String> myList = Arrays.asList("Hello", "World");
void method1(){
myList.get(0).substring(0, 1); //ok
}
}
public class Child<T> extends Parent {
void method2(){
myList.get(0).substring(0, 1); //compilation error. myList.get(0) is of type Object and not of type String
((String) myList.get(0)).substring(0, 1); // works good, but why we need to cast
}
}
更新
如公认的答案所示,扩展通用Parent<>
而不是Parent
将解决问题。
使用泛型和扩展行类型的完整示例:
public abstract class Parent<T extends MyObject> {
}
public class Child<T extends MyObject> extends Parent<T> {
}
答案 0 :(得分:8)
这是问题所在
public class Child extends Parent
由于使用了raw type Parent
,因此Parent
定义中的所有泛型都将有效地丢失。来自section 4.8 of the JLS:
原始类型的超类(分别是超接口)是对泛型类型的任何参数化的超类(超接口)的擦除。
“删除”部分是“您失去所有仿制药”的行话。
在Child
中引用类型实参时,需要指定它。例如,您可以保留一个非通用子类:
public class Child extends Parent<UUID>
或者也使子类通用:
public class Child<T> extends Parent<T>