我有一个Java函数,我想返回一个泛型类的Vector:
private static <T extends IReader> Vector<T> Read()
{
Vector<T> List = new Vector<T>(); // Create new Vector
// Create new instance of the type T
T Dataset = new T();
Dataset.myFunction();
// Add to the Vector
List.add(Dataset);
// return Vector
return List;
}
上面提到的IReader是一个非常简单的抽象类:
public abstract class IReader
{
abstract public void myFunction();
}
我在编译时得到的错误是T是一个类型参数,而且需要一个类:
error: unexpected type
T Dataset = new T();
^
required: class
found: type parameter T
where T is a type-variable:
T extends IReader declared in method <T>Read()
1 error
现在我不知道我做错了什么。我可以总结一下我的想法:T需要从IReader派生,否则Java将无法找到我调用的方法“myFunction”。此外,我需要在这里使用泛型,因为Read方法应该能够返回不同类的Vector。 关于编译器错误消息:当我替换
<T>
通过
Class<T>
它也不起作用。所以我想我被困在这里。
我的问题:如何让提到的函数“Read”返回从IReader派生的泛型类型的Vector?
提前致谢!
答案 0 :(得分:1)
不幸的是,Java Generics(与C ++模板不同)不允许使用new T()
之类的结构。发生这种情况是因为泛型被认为是语法糖,在JVM中这些实体只是Object类型的引用(与Javac不同,C ++编译器为模板参数的每个实例化派生一个单独的代码实例。
因此,您可以从函数中移出特定类型对象的创建,并将引用传递给预先创建的对象,或使用反射和显式指定的对象 class 实例化对象,如上所述java generic constructors
答案 1 :(得分:0)
考虑一个实现IReader但有一个私有的无参数默认构造函数的类。显然你不能使用默认的构造函数创建对象。考虑到这个: -
class Example extends IReader {
private Example{
}
@Override
public void myFunction(){
//your code goes here
}
}
显然,您无法在类外创建类Example的实例,在本例中为
你可以做两件事: -
1)使用反射创建对象
private static <T extends IReader> Vector<T> Read(Class<T> cl)
{
Vector<T> List = new Vector<T>(); // Create new Vector
// Create new instance of the type T
T Dataset = cl.newInstance();
Dataset.myFunction();
// Add to the Vector
List.add(Dataset);
// return Vector
return List;
}
2)您可以传递类型为T的对象,并将simpy添加到列表中
private static <T extends IReader> Vector<T> Read(T obj)
{
Vector<T> List = new Vector<T>(); // Create new Vector
// Create new instance of the type T
obj.myFunction();
// Add to the Vector
List.add(obj);
// return Vector
return List;
}