Java - 转换为E []

时间:2012-01-23 22:10:31

标签: java casting

当我转向E[](类参数)时,它需要我添加

@SuppressWarnings("unchecked")

例如:

E[] anArray = (E[]) new Object[10];

我应该做些不同的事情,还是应该是这样的呢?

由于

4 个答案:

答案 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确实检查了一个字符串。但是编译器执行类型擦除这一事实让我觉得它没有任何区别。有人可以澄清吗?