java中的通用数组创建

Generic array creation in java

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Create instance of generic type in Java?
Java how to: Generic Array creation

我正在尝试创建一个创建泛型类型的类。这是我的班级档案。

1
2
3
4
5
6
7
8
public class TestClass<T> implements AbstractDataType<T>{

    T[] contents;

    public TestClass(int length) {
        this.contents = (T[])new Object[length];
    }
}

但内容只是继承了Object class的方法。如何创建内容的抽象数组?


至于初始化contents,我认为您所拥有的是最好的。如果有办法的话,ArrayList可能会做到(第132行:http://www.docjar.com/html/api/java/util/arraylist.java.html)

但是当你说"内容只是从对象类继承了方法",我假设你的意思是,当你在代码中使用一个T实例时,你只能访问像toStringequals这样的方法,我猜这是主要的问题。这是因为您没有告诉编译器任何关于T实例的信息。如果要从特定接口或类型访问方法,则需要在T上放置类型约束。

下面是一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
interface Foo {
  int getSomething();
  void setSomethingElse(String somethingElse);
}

public class TestClass<T extends Foo> implements AbstractDataType<T> {
  T[] contents;

  public TestClass(int length) {
    this.contents = (T[])new Object[length];
  }

  public void doSomethingInteresting(int index, String str) {
    T obj = contents[index];
    System.out.println(obj.getSomething());
    obj.setSomethingElse(str);
  }
}

所以现在您可以访问继承自Object的方法以外的其他方法。


不能在Java中创建通用数组。正如Java语言规范中所说的,上面提到的规则指出:"上面的规则意味着数组创建表达式中的元素类型不能是参数化类型,而不是无界通配符。"


你认为ArrayList.toArrayArrays.copyOf是如何做到的?

Array.newInstance

1
2
3
public TestClass(Class<T> type, int length) {
    this.contents = Array.newInstance(type, length);
}


我相信在任何访问内容的方法中,您都需要将它们强制转换为T类型。其主要推理是,作为对象数组,Java将内容视为对象以适合它们。因此,虽然contents可能是T的数组,但它仍然只是Object类型的数组。