如何在不修改其余代码的情况下使用此类快照的泛型声明mixedList

List mixedList = new ArrayList();
if(flagA) {
    ClassA a = new ClassA(); //comes from elsewhere
    mixedList.add(a)
} else {
    List<ClassB> bList = new ArrayList<ClassB>();  //comes from elsewhere
    mixedList = bList; //error
}


我可以:

List<Object> mixedList = new ArrayList<Object>();
if(flagA) {
    ...
} else {
    ...
    mixedList.addAll(bList);
}


但是有办法避免更改代码吗?

最佳答案

bListList<ClassB>)分配给mixedListList<Object>)是不安全的。

您从中获得bList的服务可能会保留对其的引用。该服务将假定其列表仅包含ClassB实例。如果允许您将该列表分配给List<Object>引用,则可以在不发出警告的情况下将任何类型的对象添加到列表中。但是,当该服务认为其列表中的每个元素都是ClassB时,尝试访问这些元素时,将引发一个ClassCastException

创建一个新的List<Object>,并使用add()addAll()向其中添加元素,可以防止这种“类型污染”。您可以安全地修改列表的此副本,并让列表的源保留其自己的副本“纯”。

09-11 20:59