当我用Java编写泛型类时,我使用下面的代码
public ResizableArray() {
this.count=0;
this.elements = (T[]) new Object[0];
}
然而我收到警告:
类型安全:未选中从对象[]转换为T []
为什么我会收到此警告?
答案 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>