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

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>>静态的,例如使用类文字?

使用@SuppressWarnings("unchecked")为了消除第一个示例中由于非参数化使用List引起的警告,Class<List> cls = List.class但我不想。

有什么建议吗?


动漫人物
浏览 364回答 3
3回答

UYOU

你不能因为类型擦除.Java泛型只不过是对象类型的语法糖而已。展示:List<Integer>&nbsp;list1&nbsp;=&nbsp;new&nbsp;ArrayList<Integer>();List<String>&nbsp;list2&nbsp;=&nbsp;(List<String>)list1;list2.add("foo");&nbsp;//&nbsp;perfectly&nbsp;legal在运行时保留泛型类型信息的唯一实例是Field.getGenericType()如果通过反思审问一个班级的成员。所有这些都是为什么Object.getClass()有这样的签名:public&nbsp;final&nbsp;native&nbsp;Class<?>&nbsp;getClass();重要的是Class<?>.换句话说,从Java泛型常见问题:为什么没有具体参数化类型的类文字?因为参数化类型没有精确的运行时类型表示。类文字表示Class表示给定类型的。例如,类文字String.class表示Class表示类型的String并且与Class方法时返回的getClass在String对象。类文字可用于运行时类型检查和反射。在名为类型擦除的过程中,参数化类型在编译过程中被转换为字节码时,会丢失它们的类型参数。作为类型擦除的副作用,泛型类型的所有实例化都共享相同的运行时表示,即对应的原始类型的运行时表示。换句话说,参数化类型没有它们自己的类型表示形式。因此,没有必要形成类文字,例如List<String>.class&nbsp;,&nbsp;List<Long>.class和List<?>.class,因为没有Class物体存在。只有原始类型List有一个Class表示其运行时类型的。它被称为List.class.
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java