当我们Class
时,我理解Class<T>
的通用部分的含义,但Class
和Class<?>
之间是否有任何差异?或者有什么方法可以将Class<?>
投射到Class<? extends T>
?
答案 0 :(得分:2)
<?>
Class
和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
(好吧,我没有发现任何情况会发生这种情况,我会如果有人找到一个,我很高兴听到。)
或者有没有办法将
Class<?>
投射到Class<? extends T>
?
Casting只是一个工具,它允许您告诉编译器您知道类的运行时类型,以便使您能够使用特定于该类型的方法。一旦施放,你会对你的物体做什么,在施放它之前你不能做什么?
更新:我对您的评论的回复
它不是关于功能,而是关于类型知识。当我得到
Class<? extends Foo>
我知道我可以安全地获得此接口的方法 通过反思。
我不明白为什么你觉得它更安全:
ClassCastException
或处理NoSuchMethodException
之间的区别是什么?答案 1 :(得分:0)