可能重复:
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
继承的方法。如何为内容创建抽象数组?
答案 0 :(得分:6)
就初始化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
继承的方法以外的其他方法。
答案 1 :(得分:1)
您无法在Java中创建通用数组。 如Java Language Specification中所述,上述规则声明“上述规则意味着数组创建表达式中的元素类型不能是参数化类型,而不是无界通配符。”
答案 2 :(得分:0)
我相信在访问内容的任何方法中,您需要将它们转换为T
类型。这样做的主要原因是,作为一个Object数组,Java将内容视为适合它们的对象。因此虽然contents
可能是T
的数组,但它仍然只是一个类型的数组Object
。
答案 3 :(得分:0)
您认为ArrayList.toArray
和Arrays.copyOf
如何做到这一点?
public TestClass(Class<T> type, int length) {
this.contents = Array.newInstance(type, length);
}