我有一个如下课程:
public class MyList<E> {
private List<E> list;
public void setList(List<E> list) {
this.list = list;
}
public List<E> getList() {
return list;
}
}
我读到在类型擦除之后,所有类型参数E
都被Object
替换。因此,在类型擦除后,该课程将成为:
public class MyList {
private List<Object> list;
public void setList(List<Object> list) {
this.list = list;
}
public List<Object> getList() {
return list;
}
}
List<String>
无法分配给List<Object>
。但我们可以将List<String>
传递给setter方法,如下所示:
MyList<String> ml = new MyList<String>();
List<String> list = new ArrayList<String>();
ml.setList(list);
这背后的原因是什么?
答案 0 :(得分:2)
类型在编译后被删除但在此之前编译器会检查所有类型是否一致,因此您无法提供List<Object>
预期List<String>
的位置。
以下是Baeldung's article关于类型擦除的摘录。
编译器确保代码的类型安全并防止运行时 错误。