当前位置: 首页 > 面试题库 >

Java将用于通用类型(例如List)的“ .class”运算符转换为“ Class”>”和“类>”

松国兴
2023-03-14
问题内容

我使用.class-operator向通用类提供有关所包含类型的信息。对于非泛型包含类型,例如Integer.class,这可以正常工作。但是所包含的类型是泛型的,例如,List<Integer>.class否则List.class会导致有关类强制转换的编译时错误。

有一种方法可以避免这些错误,但是我对这里发生的事情感到好奇。有人可以解释发生了什么吗?为什么情况原样?解决问题的最佳方法是什么?

以下几行说明了该问题:注意,外部通用类型期望Class<T>作为参数,因此在这种情况下Class<List<Integer>>

Class<Integer> tInt = Integer.class;                     // Works as expected.
Class<List> tList = List.class;              // Works with warning, but is not
                                             // what i'm looking for.
Class<List<Integer>> tListInt1 = List.class;                          // Error
Class<List<Integer>> tListInt2 = (Class<List<Integer>>) List.class;   // Error
Class<List<?>> tListGeneric = (Class<List<Integer>>) List.class;      // Error

下一行有效:

Class<List<Integer>> tListInt3 = 
                (Class<List<Integer>>) ((Class<Integer>)List.class);

为什么声明tListInt2tListGeneric给予和错误?为什么先进行向上转换再进行向下转换tListInt3不会产生错误?有没有更好的方法来声明tListInt3

此致,
卡斯珀·范·登·伯格

ps。让我知道您是否想看一下需要这种类型信息的外部通用容器的代码。如有需要,我会发布。


问题答案:
Class<List<Integer>> tListInt3 = 
            (Class<List<Integer>>) ((Class<Integer>)List.class);

那行不通。你可能是说

Class<List<Integer>> tListInt3 = 
            (Class<List<Integer>>) ((Class)List.class);

我们总是可以通过上下转换从一种类型转换为另一种类型

    Integer x = (Integer)(Object)"string";

的类型List.classClass<List>;它不是子类型/超类型,Class<List<Whatever>>因此在两种类型之间直接转换是非法的。

可以争论的是Class<List<Integer>>不存在-只有一个类List;
没有此类List<Integer>(实际上只是List在运行时)

但是,这是Java类型系统的缺陷。在实践中,我们确实需要这样的东西Class<List<Integer>>。我们的解决方案-
铸造和假装Class<List<Int>>出口-同样存在缺陷-但这不是我们的错。



 类似资料:
  • 我有一个泛型类型的类,它接受构造函数参数,这样我就可以保留该类型。这是一个我在java代码中经常使用的类,所以我不想更改签名。当我尝试像这样使用构造函数时: 有办法解决这个问题吗?我无法更改的构造函数,太多的java类依赖于它。 我理解整个类型擦除问题,我真的只是想让编译器开心。

  • 问题内容: 我想在一个程序包中打印所有的类名,并在每个程序包中打印相应的属性及其数据类型。 在一个代码中,我能够以字符串形式获取类名。在另一个代码中,我可以使用以下方法获取属性及其数据类型 但是我想合并两个代码。由于在第一个代码中我以字符串的形式获得了类名,我无法使用,因为这里是类型。 因此,我需要一种将“ 类名”从类型转换为类型的方法。 我试过了,但是没有用。 问题答案: 确保是完全合格的类名,

  • 问题内容: 我有一些需要转换为.java的.class文件,所以我做到了: 而且一直以来我都有相同的错误 错误:找不到ClassName.class 你们是否知道可能是什么原因?我做了javap的人,据我所知语法是正确的。如果还有另一种将其转换为.java文件的方法,我非常愿意尝试。任何想法是极大的赞赏? 问题答案: 调用以读取字节码 该命令采用不带扩展名的类名。尝试 将.class文件转换回.j

  • 问题内容: 在Java中,从Object转换为其他类型时,为什么第二行会产生与转换相关的警告,而第一行却没有? 问题答案: 这是因为在执行时,由于 类型Erase 不会 真正 检查对象是否为a 。真的只是将其投射到。例如: __ 有关更多信息,请参见Angelika Langer的Java泛型常见问题解答 ,尤其是类型擦除部分。

  • 当动画样式改变时,为匹配的元素集合内的每个元素添加和移除指定的 Class。 如需了解更多有关 .switchClass() 方法的细节,请查看 API 文档 .switchClass()。 .switchClass() 演示 点击按钮预览特效。 <!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>j

  • 当动画样式改变时,为匹配的元素集合内的每个元素添加和移除指定的 Class。 如需了解更多有关 .switchClass() 方法的细节,请查看 API 文档 .switchClass()。 .switchClass() 演示 点击按钮预览特效。 <!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>j