如何在不修改其余代码的情况下使用此类快照的泛型声明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);
}
但是有办法避免更改代码吗?
最佳答案
将bList
(List<ClassB>
)分配给mixedList
(List<Object>
)是不安全的。
您从中获得bList
的服务可能会保留对其的引用。该服务将假定其列表仅包含ClassB
实例。如果允许您将该列表分配给List<Object>
引用,则可以在不发出警告的情况下将任何类型的对象添加到列表中。但是,当该服务认为其列表中的每个元素都是ClassB
时,尝试访问这些元素时,将引发一个ClassCastException
。
创建一个新的List<Object>
,并使用add()
或addAll()
向其中添加元素,可以防止这种“类型污染”。您可以安全地修改列表的此副本,并让列表的源保留其自己的副本“纯”。