为什么在子类中使用类型为List <>的元素强制转换为Object

时间:2019-12-05 09:42:37

标签: java generics types casting

任何人都可以解释为什么在子类中使用类型为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> {
}

1 个答案:

答案 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>