繁体   English   中英

如何实例化类的泛型变量 <Foo<T> &gt;?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM