我正在阅读有关varargs 堆污染的内容,但我并没有真正了解 varargs 或不可具体化的类型将如何对没有通用性的情况下不存在的问题负责。确实,我可以很容易地替换
public static void faultyMethod(List<String>... l) {
Object[] objectArray = l; // Valid
objectArray[0] = Arrays.asList(42);
String s = l[0].get(0); // ClassCastException thrown here
}
和
public static void faultyMethod(String... l) {
Object[] objectArray = l; // Valid
objectArray[0] = 42; // ArrayStoreException thrown here
String s = l[0];
}
第二个简单地使用了数组的协方差,这确实是这里的问题。(即使List<String>
是可具体化的,我想它仍然是的子类,Object
我仍然可以将任何对象分配给数组。)当然我可以看到两者之间有一点区别,但是这段代码是否有问题是否使用泛型。
他们所说的堆污染是什么意思(这让我想到了内存使用,但他们谈论的唯一问题是潜在的类型不安全),它与使用数组协方差的任何类型违规有何不同?