1

可能重复:
在 Java 中创建泛型类型的实例?
Java 如何:创建通用数组

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

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

    T[] contents;

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

但是内容只是具有从Object class. 如何为内容创建一个抽象数组?

4

4 回答 4

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.

于 2012-08-27T19:12:37.997 回答
1

您不能在 Java 中创建泛型数组。如Java Language Specification中所述,上述规则声明“上述规则暗示数组创建表达式中的元素类型不能是参数化类型,除了无界通配符。”

于 2012-08-27T19:09:18.737 回答
0

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

于 2012-08-27T19:09:46.873 回答
0

你是怎么想ArrayList.toArrayArrays.copyOf怎么做的?

Array.newInstance

public TestClass(Class<T> type, int length) {
    this.contents = Array.newInstance(type, length);
}
于 2012-08-27T19:16:18.320 回答