public K[] toArray()
{
K[] result = (K[])new Object[this.size()];
int index = 0;
for(K k : this)
result[index++] = k;
return result;
}
此代码似乎不起作用,它会抛出异常:
java.lang.ClassCastException:[Ljava.lang.Object;不能被投到......
有人能告诉我如何使用泛型类型创建数组吗? 感谢。
答案 0 :(得分:11)
你不能:你必须把这个类作为一个参数传递:
public <K> K[] toArray(Class<K> clazz)
{
K[] result = (K[])Array.newInstance(clazz,this.size());
int index = 0;
for(K k : this)
result[index++] = k;
return result;
}
答案 1 :(得分:1)
您的代码抛出该异常,因为它实际上为您提供了类型为Object
的数组。 Maurice Perry的代码可以正常运行,但是对K[ ]
的强制转换会产生警告,因为在这种情况下,由于类型擦除,编译器无法保证类型安全。但是,您可以执行以下操作。
import java.util.ArrayList;
import java.lang.reflect.Array;
public class ExtremeCoder<K> extends ArrayList<K>
{
public K[ ] toArray(Class<K[ ]> clazz)
{
K[ ] result = clazz.cast(Array.newInstance(clazz.getComponentType( ), this.size( )));
int index = 0;
for(K k : this)
result[index++] = k;
return result;
}
}
这将为您提供所需类型的数组,并保证类型安全。如何在my answer中深入解释这是如何工作的。来自同一时间的类似问题。
答案 2 :(得分:0)
好的,这不起作用 K [] result = new K [this.size()];
如果你能上课。然后:
Class claz;
Test(Class m) {
claz = m;
}
<K> K[] toArray() {
K[] array=(K[])Array.newInstance(claz,this.size());
return array;
}