如何动态地指定Java泛型类

时间:2018-08-30 02:20:37

标签: java kafka-consumer-api generic-programming

如果我指定了一个返回泛型类的方法,那我该怎么做,而不是动态地指定泛型的类型? 例如

  try {
        Class c =Class.forName(keytype);
        Class d= Class.forName(valuetype);
        KafkaConsumer<c,d> consumerconsumer = new KafkaConsumer<c,d>(PropertiesUtil.getPropsObj(configPath));
        return consumer ;
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }


}

但是上面的代码不正确。我该怎么做才能实现目标?

2 个答案:

答案 0 :(得分:2)

通用语法仅在编译时有效。通用类或方法中的所有类型在运行时均不可用。这称为type erasure。因此,您不能做自己想做的事情,至少不是这样。

根据您要解决的原始问题,您也许可以改用wildcards

答案 1 :(得分:2)

您可以让您的键和值类分别实现一个已知的接口。 然后,您可以分配或投射它。

KafkaConsumer<IKeyType,IValueType> consumerconsumer = new KafkaConsumer<>(PropertiesUtil.getPropsObj(configPath));

KafkaConsumer<IKeyType,IValueType> consumerconsumer1 = (KafkaConsumer<IKeyType,IValueType>) new KafkaConsumer(PropertiesUtil.getPropsObj(configPath));

在此处阅读有关在泛型上加界限的信息。 https://docs.oracle.com/javase/tutorial/java/generics/wildcards.html