[英]return a Vector of an generic class type
我有一个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?
提前致谢!
不幸的是,Java泛型(不同于C ++模板)不允许您使用new T()
类的构造。 发生这种情况是因为泛型被视为语法糖,在JVM内部,这些实体只是对象类型的引用(与Javac不同,C ++编译器为模板参数的每个实例派生单独的代码实例。
因此,您可以将特定类型的对象的创建移出函数,并将引用传递给预先创建的对象,或使用反射和显式指定的对象类实例化对象,如java通用构造函数中所述
考虑一个实现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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.