繁体   English   中英

返回一个通用类类型的Vector

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM