Java:如何从泛型类型获取类文字?
通常,我见过人们像这样使用类文字:
Class<Foo> cls = Foo.class;
但是,如果类型是通用类型,例如List,该怎么办?这可以正常工作,但由于应将List参数化,因此发出警告:
Class<List> cls = List.class
那么为什么不添加一个<?>呢?好吧,这会导致类型不匹配错误:
Class<List<?>> cls = List.class
我想像这样的事情会起作用,但这只是一个普通的语法错误:
Class<List<Foo>> cls = List<Foo>.class
如何获得Class>静态信息,例如使用类文字?
我可以使用@SuppressWarnings("unchecked")
,以摆脱在第一个例子中所造成的非参数使用列表,警告的Class<List> cls = List.class
,但我宁愿不要。
有什么建议么?
回答:
你不能由于类型擦除。
Java泛型仅是对象转换的语法糖。展示:
List<Integer> list1 = new ArrayList<Integer>();List<String> list2 = (List<String>)list1;
list2.add("foo"); // perfectly legal
泛型类型信息在运行时保留的唯一实例是Field.getGenericType()通过反射询问类成员的情况。
所有这些都是为什么Object.getClass()
具有此签名的原因:
public final native Class<?> getClass();
重要的是Class<?>
。
换句话说,从Java泛型常见问题解答:
为什么没有具体的参数化类型的类文字?
因为参数化类型没有确切的运行时类型表示形式。
类文字表示Class 表示给定类型的对象。例如,类字面量 String.class
表示Class
表示类型的对象, String
并且与在 Class
对象上getClass
调用方法时返回的 String
对象相同。类文字可用于运行时类型检查和反射。
当在编译过程中将参数化类型转换为字节码时,它们会丢失其类型参数,该过程称为类型擦除。作为类型擦除的副作用,泛型类型的所有实例共享相同的运行时表示,即相应原始类型的实例。换句话说,参数化类型没有自己的类型表示。因此,存在在形成文字类诸如没有意义的List<String>.class, List<Long>.class
并且List<?>.class
,由于没有这样的Class
对象是否存在。只有原始类型List
具有一个Class
代表其运行时类型的对象。称为 List.class
。
以上是 Java:如何从泛型类型获取类文字? 的全部内容, 来源链接: utcz.com/qa/404427.html