【发布时间】:2018-07-24 05:21:26
【问题描述】:
我正在阅读有关 varargs heap pollution 的信息,但我并没有真正理解可变参数或不可具体化类型将如何对没有通用性的情况下不存在的问题负责。确实,我可以很容易地替换
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 的子类,我仍然可以将任何对象分配给数组。)当然我可以看到两者之间有一点区别,但是无论是否使用泛型,这段代码都是错误的。
堆污染是什么意思(这让我想到了内存使用,但他们谈论的唯一问题是潜在的类型不安全),以及它与使用数组的任何类型违规有何不同协方差?
【问题讨论】:
-
好问题,请允许我添加行 objectArray[0] = 42;是实际抛出 ArrayStoreException 的那个。
标签: java generics memory variadic-functions heap-pollution