用Java创建通用数组

时间:2010-10-25 10:31:51

标签: java arrays generics casting

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;不能被投到......

有人能告诉我如何使用泛型类型创建数组吗? 感谢。

3 个答案:

答案 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;
}