1

我有一个形式的界面:

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中执行此操作的正确方法是什么?这可能吗?我的做法似乎行不通。

4

3 回答 3

2

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

于 2013-04-03T23:03:04.693 回答
1

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

于 2013-04-03T23:07:48.670 回答
0

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

于 2013-04-03T23:01:44.700 回答