如何像Class <Foo <T >>实例化泛型变量?

Ale*_*x M 1 java generics

我需要像Class>那样实例化泛型变量.例如,

Class<? extends List<String>> = ...
Run Code Online (Sandbox Code Playgroud)

变式1:

Class<? extends List<String>> clazz = LinkedList.class;
Run Code Online (Sandbox Code Playgroud)

不工作 - "不兼容的类型".

变式2:

Class<? extends List> clazz = LinkedList.class;
Run Code Online (Sandbox Code Playgroud)

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

如何实例化这样的变量?

Dim*_*eou 7

没有真正的意义Class<List<String>>,因为它等同于Class<List<Integer>>(两者都是由于擦除而引用的原始列表).

话虽如此,如果你的目的是代表List<String>类型,这是可能的,请参阅TypeLiteral谷歌吉斯.

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

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