如何实例化类<class <foo <t>&gt;?</foo <t>的泛型变量

时间:2010-01-13 12:11:10

标签: java generics

我需要像Class&gt;一样实例化泛型变量。 例如,

Class<? extends List<String>> = ...

变式1:

Class<? extends List<String>> clazz = LinkedList.class;

不起作用 - “不兼容的类型”。

变式2:

Class<? extends List> clazz = LinkedList.class;

工作,但在这种情况下,List是原始类型 - 不好。

如何实例化这些变量?

4 个答案:

答案 0 :(得分:7)

拥有Class<List<String>>并不是真的有意义,因为它等同于Class<List<Integer>>(两者都是由于删除而对原始列表的引用)。

话虽如此,如果您打算代表List<String>类型,可以参考TypeLiteralGoogle Guice

TypeLiteral<List<String>> type = new TypeLiteral<List<String>>() {};
System.out.println(type.getType()); //should print List<String>

使得它成为可能的机制是静态类型声明的反射,在类定义中(class X extends Foo<Y>,Y可通过反射获得,它保存在字节码中),方法定义等.TypeLiteral使用前者,您可能会注意到它创建了一个全新的类,因此净效果是您的类型参数被保留。当你真正打击擦除时,这是一个很好的解决方法。

答案 1 :(得分:3)

你不能正确。使用原始类型或使用不安全的演员。

答案 2 :(得分:2)

List<String> myList = new ArrayList<String>();
Class<? extends List<String>> var = (Class<? extends List<String>>)myList.getClass();

答案 3 :(得分:1)

你可以写:

    class ListString extends java.util.LinkedList<String> { }
    Class<? extends java.util.List<String>> clazz = ListString.class;

但是,考虑到Class代表什么,没有那么多。你最好尽可能避免反射。