我需要像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是原始类型 - 不好.
如何实例化这样的变量?
没有真正的意义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使用前者,你可能会注意到它创建了一个全新的类,所以净效果是你的类型参数被保留.当你真的要对抗擦除时,这是一个很好的解决方法.