Java代码导致堆污染的明显正确示例是什么?
我试图决定每次使用参数化变调变量时收到Java堆污染警告时该怎么办,例如在
public static <T> LinkedList<T> list(T... elements) {
...
}
在我看来,如果我有信心不在我的方法中使用一些奇怪的演员,我应该使用并继续前进。但这是正确的,还是我需要更加小心?在使用参数化 varargs 时,是否有明显正确的代码实际上是不安全的?@SafeVarargs
阅读有关该主题的信息,我注意到所提供的示例非常人为。例如,Java 文档显示了以下错误的方法:
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
}
这是说教的,但非常不切实际;有经验的程序员不太可能写代码做这样的事情。另一个例子是
Pair<String, String>[] method(Pair<String, String>... lists) {
Object[] objs = lists;
objs[0] = new Pair<String, String>("x", "y");
objs[1] = new Pair<Long, Long>(0L, 0L); // corruption !!!
return lists;
}
这又是以不切实际的方式非常明显地混合类型。
那么,在参数化变调下,是否存在更微妙的堆污染发生的情况呢?如果我没有以丢失类型信息或不正确混合类型的方式转换变量,我是否有理由使用?换句话说,我有理由将此警告视为一种不太重要的形式吗?@SafeVarargs