【发布时间】:2018-06-12 12:31:19
【问题描述】:
在使用参数化可变参数(例如在
中)时,我正在尝试决定每次收到 Java 堆污染警告时该怎么做public static <T> LinkedList<T> list(T... elements) {
...
}
在我看来,如果我确信不会在我的方法中使用一些奇怪的强制转换,我应该只使用 @SafeVarargs 并继续前进。但这是正确的,还是我需要更加小心?使用参数化可变参数时,是否存在明显正确但实际上不安全的代码?
阅读该主题后,我注意到所提供的示例非常人为。例如Java documentation显示如下错误方法:
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
}
这是说教,但很不切实际;有经验的程序员不太可能编写代码来做这样的事情。另一个example是
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;
}
这显然是以不切实际的方式混合类型。
那么,在参数化 varargs 下是否存在更微妙的堆污染情况?如果我没有以丢失输入信息或错误混合类型的方式转换变量,我是否有理由使用@SafeVarargs?换句话说,我是否有理由将此警告视为不是很重要的形式?
【问题讨论】:
标签: java variadic-functions heap-pollution