[英]How to instantiate generic variable like Class<Foo<T>>?
我需要实例化通用变量,例如Class>。 例如,
Class<? extends List<String>> = ...
变体1:
Class<? extends List<String>> clazz = LinkedList.class;
不起作用-“不兼容的类型”。
变体2:
Class<? extends List> clazz = LinkedList.class;
工作,但在这种情况下List是原始类型-不好。
如何实例化此类变量?
实际上,拥有Class<List<String>>
并没Class<List<String>>
,因为它等效于Class<List<Integer>>
(由于擦除,两者均是对原始List的引用)。
话虽如此,如果您打算表示List<String>
类型,则可以这样做,请参阅Google Guice的 TypeLiteral 。
TypeLiteral<List<String>> type = new TypeLiteral<List<String>>() {};
System.out.println(type.getType()); //should print List<String>
可能的机制是在两种类型的定义中反射静态类型声明( class X extends Foo<Y>
,Y通过反射可用,它保存在字节码中),方法定义等。TypeLiteral使用前者,您可能会注意到它创建了一个全新的类,因此最终结果是保留了您的类型参数。 当您真正在与擦除作斗争时,这是一个不错的解决方法。
你做的不好 。 请使用原始类型或使用不安全的强制类型转换。
List<String> myList = new ArrayList<String>();
Class<? extends List<String>> var = (Class<? extends List<String>>)myList.getClass();
你可以写:
class ListString extends java.util.LinkedList<String> { }
Class<? extends java.util.List<String>> clazz = ListString.class;
但是,考虑到Class
代表的意义,没有太多意义。 您最好尽可能避免反射。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.