类型安全:未选中从对象[]到T []的强制转换

时间:2013-11-03 19:39:17

标签: java generics generic-programming

当我用Java编写泛型类时,我使用下面的代码

public ResizableArray() {
    this.count=0;
    this.elements = (T[]) new Object[0];
}

然而我收到警告:

  

类型安全:未选中从对象[]转换为T []

为什么我会收到此警告?

2 个答案:

答案 0 :(得分:2)

你正在创建一个Object [](即一个类“Object”的实例数组,所以基本上是一个任何东西的数组)。你将它转换为T [](这是一个只能包含类T实例的数组)。你不测试数组中的对象(我知道没有,但编译器没有)实际上是一个T - 如果不是,则演员将在运行时抛出ClassCastException。这就是你收到警告的原因。

答案 1 :(得分:1)

如果T除了Object之外还有其他任何内容,那么你基本上就是那个沮丧的人。这是因为与通用类型不同,Java数组的类型是具体化。换句话说,

boolean isStringArray(Object[] os) { return os instanceof String[]; }

调用
System.out.println(isStringArray(new Object[]));

实际打印false:运行时知道数组的组件类型。

你真正想要做的是return new T[],但你可能已经发现这是不允许的,并且由于上面描述的泛型和数组类型之间的不匹配而不允许这样做。 / p>