Java创建类型泛型的数组

时间:2013-12-13 01:52:02

标签: java

我有一个通用的K并希望创建一个空数组,所以我输入

private K[] keys   = new K[0];

然而eclipse说“无法创建K的通用数组”

我错过了什么吗?你可以创建一个int的空数组,这是泛型不能做的吗?

3 个答案:

答案 0 :(得分:2)

您无法在Java中创建泛型数组。解决方法是:

keys = (K[])new Object[size]; 

虽然这会产生编译器警告。

一般来说,这不是一个好习惯,做起来并不安全。有关更多信息,请参阅this主题。

但是,如果你无法避免它,它应该只与new一起使用,因为Object数组到K[]的这种转换可能会用来插入你赢得的东西不喜欢。

更新

但实际上,正如您在this中看到的那样,回答java.lang.reflect.Array.newInstance()可能是使用反射库的更安全方式。

答案 1 :(得分:1)

如果K是抽象的,该怎么办?遗嘱执行人如何知道如何填补任何缺失的方法?

此外,由于编译时的类型擦除,如果不将其与其他类比较,您无法确定哪个类K实际存在,这需要一个实例。

Type erasure

答案 2 :(得分:1)

你可以使用Array.newInstance()方法来实现这样的目标;考虑

public class Question<K> {
  private K[] keys;

  @SuppressWarnings("unchecked")
  public Question(Class<? extends K> cls, int size) {
    this.keys = (K[]) Array.newInstance(cls, size);
  }

  public K[] getKeys() {
    return keys;
  }

  public static void main(String[] args) {
    Question<String> question = new Question<String>(
        String.class, 10);
    String[] keys = question.getKeys();
    keys[0] = "Hello";
    keys[1] = "World";
    keys[2] = "Goodbye";
    keys[3] = "I must";
    keys[4] = "be Going";
    keys[5] = "Now";
    keys[6] = "Parting";
    keys[7] = "is";
    keys[8] = "such";
    keys[9] = "sweet sorrow";
    System.out.println(Arrays.toString(question
        .getKeys()));
  }
}

这里打印

[Hello, World, Goodbye, I must, be Going, Now, Parting, is, such, sweet sorrow]