【发布时间】:2021-07-24 06:19:28
【问题描述】:
此代码有效,我不明白列表如何添加原始类型框,我认为类型擦除会将类型设置为指定的范围。 注意:Paper 类不扩展 Bakery 类。
编辑:我的理解正确吗?编译器对原始框类型进行类型转换,以便可以将其添加到列表中?这仅在编译时有效吗?所以如果我试图在运行时获取值,它会抛出异常?
class Violator {
public static List<Box<? extends Bakery>> defraud() {
List<Box<? extends Bakery>> list = new ArrayList<>();
Paper paper = new Paper();
Box box = new Box<>();
box.put(paper);
list.add(box);
return list;
}
}
class Box<T> {
void put(T item) { /* implementation omitted */ }
T get() { /* implementation omitted */ }
}
【问题讨论】:
-
您可以将原始类型分配给泛型类型。例如拥有
List<String> names; List raw = new ArrayList();,您可以分配names = raw;。我的猜测是:因为在引入泛型类型之前,代码写成List getNames() { /*generates and returns list containing Strings with names*/ }。这让程序员可以像List<String> names = oldPojo.getNames();一样使用它(带有警告)——注意getNames()返回rawList。因此,您还可以将您的Box box(原始)分配给Box<? extends Bakery>或Box<Bakery>。
标签: java generics type-erasure