具有泛型列表的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,我更新了问题