返回泛型类类型的Vector

时间:2014-03-07 08:25:49

标签: java class vector abstract

我有一个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?

提前致谢!

2 个答案:

答案 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;
}