带有通用列表的Java引用分配

Tih*_*hom 3 java generics casting list

我觉得这很愚蠢,但我是.

该行在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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

MyCompany实现了HasId所以我认为我应该能够分配它.为什么我不能?而且更重要的是,什么是分配给该对象的HasId列表的简单方法.

更新:列表ids = (List<HasId>)list;打破不可转换的类型

Mik*_*e Q 9

不允许这样的通用赋值的原因是可以进行转换,然后添加一些ids不是MyCompany的东西(也许MyPerson也实现了HasId).因此,如果演员被允许,那么你可以这样做.

public void myMethod(List<MyCompany> list){
    List<HasId> ids = list;
    ids.add(new MyPerson());
}
Run Code Online (Sandbox Code Playgroud)

现在该列表打破了通用保证,因为您有<MyCompany>一个声明为MyPerson的列表.

你可以像这样投射它.

public void myMethod(List<MyCompany> list){
    List<? extends HasId> ids = list;
}
Run Code Online (Sandbox Code Playgroud)

但是不允许使用add()操作,但如果您愿意,可以迭代它以获取id.