我正在寻找一个副本,但是没有看到一个副本足以满足要求。
您无法在Java中实例化抽象类,并且Number是抽象的,所以为什么要编译此行:
Number num = 3;
如果它是Integer num,它将自动装箱,但是即使它是抽象的,自动装箱也能以某种方式为Number工作吗?还是正在发生其他事情?
不是自动装箱适用于Number
。您完全正确,Number
类是抽象的,无法实例化。 Java中也没有将原始数字自动装箱到Number
对象中的通用机制。
这是自动装箱从int
到Integer
的过程。文字3
是int
(无例外)。并且Integer
是Number
的具体子类,因此将对Integer
的引用放入声明为Number
的变量中是没有麻烦的。
我同意你的想法,这可能有点令人惊讶。自动装箱的基本规则是,可以将int
放在期望的Integer
处,将double
放在期望的Double
处,依此类推。我们很难说在初始化的右侧必定会出现Integer
。看来他们已经扩展了该规则以适用于此。毫无疑问,在JLS的某个地方(JLS:Java语言规范)。
仅供检查,我们可以这样做:
Number num = 3;
System.out.println(num.getClass());
输出:
class java.lang.Integer
您可以将规则进一步扩展:
Object obj = 3;
它仍然会为您提供Integer
(即使Object
是一个具体的类,也不只是Object
。
Link:相似的问题:Does Java autobox when assigning an int to an Object?(您还将在此处找到对JLS的引用)
[Integer
是Number
的子类,因此3
从int
自动装箱到Integer
,然后Integer
被存储在Number
变量中。