繁体   English   中英

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

[英]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>

这是类型安全

List<HasId> ids ;  

它被声明只接受HasId列表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM