[英]Java Reference assignment with generic lists
我觉得这很愚蠢,但我是。
行List<HasId> ids = list
在以下代码中给出了编译错误:
public class MyGarbageClass {
public void myMethod(List<MyCompany> list){
List<HasId> ids = list;
}
interface HasId {
int getId();
}
class MyCompany implements HasId{
private int id = 5;
@Override
public int getId() {
return id;
}
}
}
MyCompany实现了HasId所以我认为我应该能够分配它。 为什么我不能? 更重要的是,将此分配给HasId对象列表的简单方法是什么。
update :List ids = (List<HasId>)list;
也打破了不可转换的类型
不允许这样的泛型赋值的原因是可以进行转换,然后向不是MyCompany的子ids
添加一些东西(也许MyPerson也实现了HasId)。 因此,如果演员被允许,那么你可以这样做。
public void myMethod(List<MyCompany> list){
List<HasId> ids = list;
ids.add(new MyPerson());
}
现在该列表已经破坏了通用保证,因为您有一个声明为<MyCompany>
列表,其中包含MyPerson。
你可以像这样投射它。
public void myMethod(List<MyCompany> list){
List<? extends HasId> ids = list;
}
但是不允许使用add()操作,但如果您愿意,可以迭代它以获取id。
这是不允许的,因为它可能允许你这样做:
List<MyCompany> companies = ...;
List<HasId> ids = companies;
ids.add(new HasId() {});
MyCompany c = companies.pop(); // <---- Not a MyCompany!!!!
您可能会发现使用List<? extends HasId>
List<? extends HasId>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.