在Java中创建通用数组

4
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; 无法转换为 ...

有人可以告诉我如何创建一个具有泛型类型的数组吗? 谢谢。


可能是https://dev59.com/BHRC5IYBdhLWcg3wJNqf的重复问题:快速Java问题:将对象数组转换为我想要的类的数组。 - Gaurav Saxena
在发布之前请搜索,因为至少有三个重复的。 - Bozho
第n个问题与许多其他问题相同 :) - Jack
2
以后请注意:应该使用“throw an exception”,而不是“through”。关键字是“throw”。 - DJClayworth
可能是如何创建泛型数组的重复问题。 - Joeri Hendrickx
3个回答

10

你不能这样做:你必须将该类作为参数传递:

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

好的,这个不起作用

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

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

这将为您提供所需类型的数组,并保证类型安全。其工作原理在我之前回答类似问题时已经详细解释过。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接