当我转向E[]
(类参数)时,它需要我添加
@SuppressWarnings("unchecked")
例如:
E[] anArray = (E[]) new Object[10];
我应该做些不同的事情,还是应该是这样的呢?
由于
答案 0 :(得分:4)
这是对的。想象:
Object[] o = new Object[10];
o[0] = new A(); // A is not a subclass of E
E[] e = o; // Now you have broken the type system: e[0] references something that is not an E.
它的工作方式,你必须显式转换,以使编译器忽略这种可能性。
答案 1 :(得分:3)
你应该阅读Effective Java书。简而言之,不可能确切地告诉你什么是正确的行动方案,因为我们不知道你在做什么,但通常你不应该压制这个警告。因此,最有可能的解决方案是使用类型安全的通用集合而不是数组。
答案 2 :(得分:2)
因为type erasure而应该这样做。
为避免必须取消警告,您唯一可以做的就是使用List<E>
(或类似的Collection
)。
答案 3 :(得分:2)
是的,你应该这样做,因为我们不能初始化这样的泛型数组:
E[] array = new E[10]; // Compile error
你必须按照你的写作去做。我知道没有办法解决。
另一种方法是使用对象数组(而不是E)。您可以看到Java API开发人员在ArrayList类中也是这样做的:
/**
* The array buffer into which the elements of the ArrayList are stored.
* The capacity of the ArrayList is the length of this array buffer.
*/
private transient Object[] elementData;
他们只是像这样初始化这个数组:
elementData = new Object[size];
在他们使用它的任何地方,他们都会投射阵列内容:
/**
* Returns the element at the specified position in this list.
*
* @param index index of the element to return
* @return the element at the specified position in this list
* @throws IndexOutOfBoundsException {@inheritDoc}
*/
public E get(int index) {
RangeCheck(index);
return (E) elementData[index];
}
我不太确定,但我认为第一种方法更快,因为在运行时不需要进行转换。我认为Java VM将花费一些时间来构建它。为什么我这么想?因为这会在运行时出错:
Integer i = new Integer(34);
Object o = i;
String s = (String) o; // Runtime error
所以这意味着VM确实检查了是一个字符串。但是编译器执行类型擦除这一事实让我觉得它没有任何区别。有人可以澄清吗?