java中的通用数组创建

时间:2012-08-27 19:00:36

标签: java generics

  

可能重复:
  Create instance of generic type in Java?
  Java how to: Generic Array creation

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

public class TestClass<T> implements AbstractDataType<T>{

    T[] contents;

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

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

4 个答案:

答案 0 :(得分:6)

就初始化contents而言,我认为你拥有的是最好的。如果有办法,ArrayList可能会这样做(第132行:http://www.docjar.com/html/api/java/util/ArrayList.java.html

但是当你说“内容只有从Object类继承的方法”时,我假设你的意思是你只能在工作时访问toStringequals等方法你的代码中有一个T实例,我猜这是主要问题。那是因为你没有告诉编译器有关T实例的内容。如果要从特定接口或类型访问方法,则需要在T上设置类型约束。

以下是一个例子:

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继承的方法以外的其他方法。

答案 1 :(得分:1)

您无法在Java中创建通用数组。 如Java Language Specification中所述,上述规则声明“上述规则意味着数组创建表达式中的元素类型不能是参数化类型,而不是无界通配符。”

答案 2 :(得分:0)

我相信在访问内容的任何方法中,您需要将它们转换为T类型。这样做的主要原因是,作为一个Object数组,Java将内容视为适合它们的对象。因此虽然contents可能是T的数组,但它仍然只是一个类型的数组Object

答案 3 :(得分:0)

您认为ArrayList.toArrayArrays.copyOf如何做到这一点?

请参阅Array.newInstance

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