通常情况下,我见过人们这样使用类文字:

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>>,例如使用类文本?

在第一个示例Class<List> cls = List.class中,我使用@SuppressWarnings("unchecked")来消除由于非参数化使用List而引起的警告,但我不希望这样.

有什么建议吗?

推荐答案

因为是type erasure,所以你不能go .

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 Generics FAQ:

为什么具体的参数化类型没有类文字?

Because parameterized type has no exact runtime type representation.

类文字表示Class 表示给定类型的. 例如,类文字 String.class代表Class 对象,该对象表示该类型 String,它与 Class在执行以下操作时返回的对象 方法getClass是在 String号客体.类文字可以 用于运行时类型判断,并且 以供反思.

参数化类型将丢失其类型

Java相关问答推荐

如何从片段请求数据到活动?在主要活动中单击按钮请求数据?

当列顺序更改时,Table View列列表的Change. wasPermanted()总是返回假

try 使用Java 9或更高版本对特殊对象图进行解析时出现NullPointerException

填写文本字段后锁定PDF

使用JdkClientHttpRequestFactory通过Spring RestClient和Wiemock读取时达到EOF

现场观看Android Studio中的变化

AssertJ Java:多条件断言

如何让DTO接受空字符串字段,但如果它们不为空,则应用JPA验证?

从ActiveMQ Classic迁移到ActiveMQ Artemis需要进行哪些客户端更改?

Log4j与jdk21兼容吗?

有效的公式或值列表必须少于或等于255个字符

Groovy/Java:匹配带引号的命令选项

当构造函数创建一个新实例时,Java为什么需要&new";

来自外部模块的方面(对于Java+Gradle项目)不起作用

Dijkstra搜索算法的实现

错误:不兼容的类型:Double不能转换为Float

S数学.exp的相同错误保证也适用于StrictMath.exp吗?

在Java泛型中使用通配符时,如何推断类型

不能在 map 上移除折线

ReturnedRect在升级后反转