为了账号安全,请及时绑定邮箱和手机立即绑定

Java:如何从泛型类型中获得类文字?

Java:如何从泛型类型中获得类文字?

森栏 2019-07-13 09:36:45
Java:如何从泛型类型中获得类文字?通常,我看到人们使用类文字如下: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 能使用@SuppressWarnings("unchecked")为了消除第一个示例中由于非参数化使用List引起的警告,Class<List> cls = List.class但我不想。有什么建议吗?
查看完整描述

3 回答

?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

你不能因为类型擦除.

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方法时返回的getClassString对象。类文字可用于运行时类型检查和反射。

在名为类型擦除的过程中,参数化类型在编译过程中被转换为字节码时,会丢失它们的类型参数。作为类型擦除的副作用,泛型类型的所有实例化都共享相同的运行时表示,即对应的原始类型的运行时表示。换句话说,参数化类型没有它们自己的类型表示形式。因此,没有必要形成类文字,例如List<String>.class , List<Long>.classList<?>.class,因为没有Class物体存在。只有原始类型List有一个Class表示其运行时类型的。它被称为List.class.


查看完整回答
反对 回复 2019-07-13
  • 3 回答
  • 0 关注
  • 284 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信