从Java中的泛型类型创建列表

时间:2013-04-03 22:55:20

标签: java reflection

我有一个表格界面:

public interface Tester<K1, V1> {
    ...
}

客户端将实现此接口,然后将.class文件传递给它们的子类。然后我按以下方式从界面解析出K1,V1:

// Assume only Tester<K1, V1> is implemented for now:
Type genericInterface = ClientClass.class.getGenericInterfaces()[0]; 
if(genericInterface instanceof ParameterizedType){
    Type[] genericTypes = ((ParameterizedType) genericInterface).getActualTypeArguments();
    List<?> myList = new ArrayList<genericTypes[1]>(); // THIS DOES NOT WORK!
}

我正在尝试基于其接口中声明的泛型类型来实例化列表。在java中执行此操作的正确方法是什么?这可能吗?我正在进行的方式似乎不起作用。

3 个答案:

答案 0 :(得分:2)

而不是List<?> myListList<Object> myList或更老的风格:List myList。后者会给你编译器警告,这是仿制药帮助之前的风格。我不能完全理解你想做什么。您是否基本上尝试在运行时确定泛型的类型? 引入了泛型,因此您可以进行编译类型错误检查。除非有一个非常好的理由,否则请尽量避免使用泛型(我只能想到如果你构建了一些缓存框架,你必须处理所有内容,我已经看过了)。尝试在这些对象中找到最常见的分母基类,然后尝试处理/存储。

答案 1 :(得分:1)

在您的情况下, 可以做到。但是,从语法上讲,创建ArrayList的方式是非法的,因为必须在编译时知道泛型类型参数。改为使用new ArrayList<Object>(在构造函数调用和声明中)。

答案 2 :(得分:0)

我不认为在Java中可以使用动态值,例如示例中的genericTypes [1]。 Java中的泛型基本上是语法糖,它在编译时应用。大多数情况下,类型信息在运行时被擦除。在http://docs.oracle.com/javase/tutorial/java/generics/erasure.html

的Java教程中提供了一些其他信息