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

时间:2016-05-06 06:41:50

标签: 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,altitude,latitude ......我想获得这些字段的模式。用户可以将任何字段类型的任何类型发送到程序,因此直到运行时字段类型未知。

示例:

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>();
}

1 个答案:

答案 0 :(得分:2)

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

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

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();
        }
        ...
    }
}