Java使用运行时获取的类型参数创建泛型实例

标签 java generics runtime

我有一堂这样的课:

public class Pojo<T, P> {}

我在编译时知道 T 的类型,但不知道 P 的类型。我想知道这样的事情是否可能:

Class<Integer> t = Integer.class;
field = new Pojo<Integer, t>();

如果不是,任何替代解决方案都是有效的;)

编辑: 我正在尝试从 POJO 字段获取统计数据,即,我有一个类 AirRegister,其中包含字段 station、o3、so2、海拔、纬度...,我想获取这些字段的模式。用户可以将具有任何字段类型的任何类型发送到程序,因此在运行时字段类型是未知的。

示例:

public static void main(String[] args) {
    String field = args[0];
    Class<fieldType> type = AirRegister.class.getDeclaredField(field).getClass();
    ModeImpl<AirRegister, type> p = new ModeImpl<AirRegister, type>();
}

最佳答案

这是不可能的。泛型只是编译时的功能。编译器使用它们对源代码进行类型检查,但在运行时它们就消失了。

如果您需要实现运行时类型检查,您可以使用Class实例来存储所需的类型。例如:

class Pojo<T> {
    private Class<?> clazz;
    Pojo(Class<?> clazz) {
        this.clazz = clazz;
    }
    void doSomething(T arg1, Object arg2) {
        if (!clazz.isInstance(arg2)) {
            throw new ClassCastException();
        }
        ...
    }
}

关于Java使用运行时获取的类型参数创建泛型实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37065952/

相关文章:

java - Hibernate-search 无法在映射组件中找到字段

java - << 是 C++ 的东西 - Java 等价物

java - 如何编写不需要try/catch的异常?

Java 8、Swing 和 OSX : Dialogs make UI unresponsive to Mouse

java - 为什么我能够将 Long 传递给 Map.get() 方法,该方法不是以 Long 为键的

c# - 泛型方法中根据类型调用方法

C# 使用反射获取通用参数名称

c# - 持有并获取ListView Item索引

java - Runtime.exec(cmd) 的用户

java - 进程 p = Runtime.getRuntime().exec() 将异步运行?