我需要像Class>一样实例化泛型变量。 例如,
Class<? extends List<String>> = ...
变式1:
Class<? extends List<String>> clazz = LinkedList.class;
不起作用 - “不兼容的类型”。
变式2:
Class<? extends List> clazz = LinkedList.class;
工作,但在这种情况下,List是原始类型 - 不好。
如何实例化这些变量?
答案 0 :(得分:7)
拥有Class<List<String>>
并不是真的有意义,因为它等同于Class<List<Integer>>
(两者都是由于删除而对原始列表的引用)。
话虽如此,如果您打算代表List<String>
类型,可以参考TypeLiteral的Google 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
代表什么,没有那么多。你最好尽可能避免反射。