【发布时间】:2016-12-11 09:31:00
【问题描述】:
这个问题特定于使用带有泛型Enum<E>s 的可变参数:
如果我这样定义方法,为什么会收到此警告 Type safety: Potential heap pollution via varargs parameter elements:
<E extends Enum<E>> void someMethod(E... elements)
与此相反:
<E extends Enum<E>> void someMethod(E[] elements)
因此,在声明方法@SafeVarargs之前应该注意什么?
类似问题
这个问题类似于关于Collection<T>... 的这些问题,但这些答案中显示的场景似乎不适用于Enum<E>...:
- Potential heap pollution via varargs parameter
- Type safety: Potential heap pollution via varargs parameter subtrees
- Potential heap pollution via varargs parameter
- Eclipse different behaviour for "Unchecked" warning due to "Potential heap pollution via varargs parameter". How to fix?
这个问题的反面是质疑为什么没有警告:
示例代码
这是我试图污染堆的方法,但每次错误尝试都会导致 java.lang.ArrayStoreException 而不是污染数组。
我正在使用 Eclipse 4.6.0 和 Java JDK 8u74。
public static void main(String[] args) {
Foo[] x = { Foo.A };
someMethod(x);
Foo y = x[0]; // How does one get a ClassCastException here?
}
private static enum Foo {
A, B, C,
}
private static enum Bar {
X, Y, Z,
}
// This produces a "Type safety" warning on 'elements'
private static <E extends Enum<E>> void someMethod(E... elements) {
Object[] objects = elements;
// Test case 1: This line throws java.lang.ArrayStoreException
objects[0] = "";
// Test case 2: Program terminates without errors
objects[0] = Foo.A;
// Test case 3: This line throws java.lang.ArrayStoreException
objects[0] = Bar.X;
}
【问题讨论】:
标签: java enums variadic-functions