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

时间:2014-05-16 16:14:39

标签: java generics

当我们Class时,我理解Class<T>的通用部分的含义,但ClassClass<?>之间是否有任何差异?或者有什么方法可以将Class<?>投射到Class<? extends T>

2 个答案:

答案 0 :(得分:2)

关于差异Raw / <?>

  

ClassClass<?>之间有什么区别?

Raw TypesUnbounded 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)