我正在尝试创建一个创建泛型类型的类。这是我的类文件。
public class TestClass<T> implements AbstractDataType<T>{
T[] contents;
public TestClass(int length) {
this.contents = (T[])new Object[length];
}
}
但是内容只是具有从Object class
. 如何为内容创建一个抽象数组?
我正在尝试创建一个创建泛型类型的类。这是我的类文件。
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)
但是当你说“内容只有从 Object 类继承的方法”时,我假设你的意思是你只能访问方法toString
,equals
当你在代码中使用 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
.
您不能在 Java 中创建泛型数组。如Java Language Specification中所述,上述规则声明“上述规则暗示数组创建表达式中的元素类型不能是参数化类型,除了无界通配符。”
我相信在任何访问内容的方法中,您都需要将它们转换为 type T
。这样做的主要原因是,作为一个 Object 数组,Java 将内容视为 Objects 以适应它们。所以虽然contents
可能是一个 数组T
,但它仍然只是一个 type 数组Object
。
你是怎么想ArrayList.toArray
和Arrays.copyOf
怎么做的?
public TestClass(Class<T> type, int length) {
this.contents = Array.newInstance(type, length);
}