具有泛型列表的Java引用赋值
问这个我觉得很愚蠢,但我是 行具有泛型列表的Java引用赋值,java,generics,list,casting,Java,Generics,List,Casting,问这个我觉得很愚蠢,但我是 行List ids=List给出了以下代码中的编译错误: public class MyGarbageClass { public void myMethod(List<MyCompany> list){ List<HasId> ids = list; } interface HasId { int getId(); } class MyCompany implemen
List 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;
}
}
}
公共类MyGarbageClass{
公共无效myMethod(列表){
列表ID=列表;
}
接口HasId{
int getId();
}
类MyCompany实现HasId{
私有int id=5;
@凌驾
公共int getId(){
返回id;
}
}
}
我的公司实现了HasId,所以我想我应该能够分配它。为什么我不能?更重要的是,将其分配给HasId对象列表的简单方法是什么
更新:列表ID=
(列表)列表代码>在不可转换类型上也会中断,这是不允许的,因为它可能允许您执行以下操作:
List<MyCompany> companies = ...;
List<HasId> ids = companies;
ids.add(new HasId() {});
MyCompany c = companies.pop(); // <---- Not a MyCompany!!!!
上市公司=。。。;
列表ID=公司;
add(新的HasId(){});
MyCompany c=companys.pop();// 它是
List<HasId> ids ;
列表id;
声明只接受HasId
列表不允许这样的一般分配的原因是可以进行转换,然后向ids
中添加一些不是MyCompany的内容(可能是MyPerson,它也实现了HasId)。因此,如果演员阵容被允许,那么你可以这样做
public void myMethod(List<MyCompany> list){
List<HasId> ids = list;
ids.add(new MyPerson());
}
public void myMethod(列表){
列表ID=列表;
add(newmyperson());
}
现在,该列表已经打破了一般保证,因为您的列表被声明为
,其中有一个MyPerson
你可以这样投
public void myMethod(List<MyCompany> list){
List<? extends HasId> ids = list;
}
public void myMethod(列表){
列表那也不是演员阵容,那是一个参考任务。演员阵容应该是int a=(int)b;@Jeff Storey,我更新了问题