通常,我见过人们像这样使用类文字:
Class<Foo> cls = Foo.class;
但是如果类型是通用的,例如列表?这工作正常,但有一个警告,因为 List 应该参数化:
Class<List> cls = List.class
那么为什么不添加一个<?>
?好吧,这会导致类型不匹配错误:
Class<List<?>> cls = List.class
我认为这样的东西会起作用,但这只是一个简单的语法错误:
Class<List<Foo>> cls = List<Foo>.class
我怎样才能得到一个Class<List<Foo>>
静态地,例如使用类文字?
I could use @SuppressWarnings("unchecked")
消除第一个示例中由非参数化使用 List 引起的警告,Class<List> cls = List.class
,但我宁愿不。
有什么建议么?
你不能因为类型擦除 http://java.sun.com/docs/books/tutorial/java/generics/erasure.html.
Java 泛型只不过是对象转换的语法糖。展示:
List<Integer> list1 = new ArrayList<Integer>();
List<String> list2 = (List<String>)list1;
list2.add("foo"); // perfectly legal
在运行时保留泛型类型信息的唯一实例是Field.getGenericType() http://docs.oracle.com/javase/6/docs/api/java/lang/reflect/Field.html#getGenericType()如果通过反射询问类的成员。
这一切都是为什么Object.getClass() http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html#getClass()有这个签名:
public final native Class<?> getClass();
重要的部分是Class<?>
.
换句话说,从Java 泛型常见问题解答 http://www.angelikalanger.com/GenericsFAQ/FAQSections/ParameterizedTypes.html#FAQ106:
为什么没有具体参数化类型的类文字?
因为参数化类型没有精确的运行时类型表示。
类文字表示一个Class
表示给定类型的对象。
例如,类字面量String.class
表示Class
代表类型的对象String
并且与Class
时返回的对象
方法getClass
被调用于String
目的。类文字可以
用于运行时类型检查和
供反思。
参数化类型失去其类型
当参数被翻译成
编译期间的字节码
过程称为类型擦除。作为一个
类型擦除的副作用,全部
泛型类型的实例共享
相同的运行时表示,
即相应的原始
类型 。换句话说,参数化
类型没有类型表示
他们自己的。因此,有
形成类文字没有意义
例如List<String>.class
,
List<Long>.class
and List<?>.class
,因为没有这样的Class
对象存在。
仅原始类型List
has a Class
代表其运行时的对象
类型。它被称为List.class
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)