这个Java语句如何在没有警告的情况下编译?
Class<Integer> x = int.class;
即使
Integer.class != int.class
修改:以不同的方式,似乎Integer.class
和int.class
没有任何共同点(请参阅下面的评论),为什么它有意义呢?这项任务可能吗?
答案 0 :(得分:6)
经过大量搜索,我在JLS中看到了这个小片段,section 15.8.2 Class Literals:
如果p是基本类型的名称,则让B为装箱转换后的类型p的类型(第5.1.7节)。那么p.class的类型是Class&lt; B&gt;。
规范并没有解释为什么会这样,而不是Class<?>
。我也未能找到任何证据证明这与仿制药或自动装箱有关。
Integer
是一流的对象,而int
是基本类型,Class
的大多数方法,例如isInstance
,isAssignableFrom
和{{对cast
s进行操作的1}}在Object
的上下文中无效。因此,我认为没有任何理由说明int.class
的类型为int.class
。
答案 1 :(得分:4)
由于autoboxing。您不能在类型参数中使用原语,因此原语被装入包装器。
答案 2 :(得分:4)
我不相信这与自动装箱有任何关系。
这是泛型规则的一部分,它将原始类型视为包装器。