java - 我可以用 Class<?> 做什么?

标签 java generics

我理解Class的通用部分的含义当我们有Class<T>时,但是 Class 之间有什么区别吗?和Class<?> ?或者有什么办法类型转换Class<?>例如,Class<? extends T>

最佳答案

关于差异Raw/<?>

is there any difference between Class and Class<?>?

Raw Types之间确实有区别和 Unbounded Wildcards types .

您不应使用原始类型。 基本上,原始类型只是 JDK 5.0 之前的 Java 遗留下来的,当时还没有泛型。应避免使用它们,因为使用它们时在编译时不会执行某些检查,这与无界通配符类型不同。

集合示例

集合的示例是原始类型和无界通配符类型之间差异的最佳示例:

List listRaw = new LinkedList<Integer>();
List<?> listUnknown  = listRaw; // allowed at compile time

listRaw.add("blah blah");     // allowed at compile time
listUnknown.add("blah blah"); // compile error

在这里,你不会遇到任何运行时错误,因为 type erasure :泛型只是生成编译错误的语法糖,但任何列表都只是运行时的对象列表。

返回Class示例

对于类型 Class ,我想说这样的问题很难被注意到,因为 Class<T> 中没有方法接受 T 类型的参数。 因此,您不会有会引发编译错误 Class<?> 的方法调用。但不包括 Class (好吧,我没有发现任何发生这种情况的案例,如果有人找到的话我会很高兴听到)。

关于 Actor 问题

Or is there any way of casting Class<?> to, for example, Class<? extends T> ?

转换只是一个工具,它允许您告诉编译器您知道该类的运行时类型,以便您能够使用特定于该类型的方法。一旦你的对象被转换,你会对其做什么,而在转换之前你无法做到这一点?

更新:我对您评论的回复

It isnt about functionality, but about type knowledge. When I get Class<? extends Foo> i know i can safely get methods of this interface by reflection.

我不明白为什么你觉得它更安全:

  • 如果运行时类型正确,则不需要强制转换即可使用反射。
  • 如果运行时类型错误,那么处理 ClassCastException 有什么区别?或处理 NoSuchMethodException

关于java - 我可以用 Class<?> 做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23700031/

相关文章:

java - 如何从文件中读取用户定义的对象?

arrays - 在通用和惯用的 Swift 中递归计算多维数组中的项目

java - 无法使用 HttpPost 上传文档

java - 反序列化时如何找到对象所属的正确子类?

java - 用Java动态查找局域网中的其他主机

swift - 通用功能中未识别协议(protocol)一致性

Java嵌套泛型类型

c# - 如何将 DataView、DataRowView 转换为通用类型列表

c# - 有没有办法让 C# 泛型处理这种情况

java - 在特定行sql java中插入值