为什么Number的自定义子级不继承自动装箱?

Mat*_*det 4 java primitive autoboxing numbers wrapper

我了解Java不支持自定义自动装箱,但我也注意到可以扩展Number对象。由于数字对象本身似乎允许对原语进行自动装箱,因此可以这样做:

Number val = 5; //This compiles no problem

但是,如果我扩展Number并尝试使用子类型,则该程序将无法编译:

MyNumber num = 5; //This does not compile :(

我知道这是不允许的,在Java中可能永远不会允许,但是什么机制导致这种不连续性发生?是Number的包装器功能是否在类本身之外的地方处理,或者是否有某些特殊的封装阻止自定义包装器的创建?

JB *_*zet 5

5是整数文字。因此,其类型为int

由于已将其分配给引用类型(数字)的变量,因此将自动装箱为其包装类型:java.lang.Integer。然后将此Integer分配给变量,并且由于Integer Number而有效,因为Integer类扩展了Number类。

相反,Integer不扩展MyNumber。因此,将Integer分配给类型变量MyNumber是无效的:Integer不是MyNumber。

因此,这与取消装箱没有太大关系。这与你不能做的事实有关

MyNumber n = someInteger;
Run Code Online (Sandbox Code Playgroud)

就像你不能那样

MyNumber n = someString;
Run Code Online (Sandbox Code Playgroud)

:类型不兼容。