我知道 Java 不支持自定义自动装箱,但我也注意到我可以扩展 Number 对象。由于数字对象本身似乎允许对原语进行自动装箱,因此可以使用:
Number val = 5; //This compiles no problem
但是,如果我扩展 Number 并尝试使用子类型,则程序将无法编译:
MyNumber num = 5; //This does not compile :(
我知道这是不允许的,并且在 Java 中可能永远不会被允许,但是是什么机制导致了这种不连续性的发生? Number 的包装器功能是在类本身之外的某个地方处理的,还是可能有一些特殊的封装阻止了自定义包装器的创建?

最佳答案

5 是整数文字。因此它的类型是 int

由于它被分配给一个引用类型 (Number) 的变量,因此它被自动装箱为其包装类型: java.lang.Integer 。然后将此 Integer 分配给变量,这是有效的,因为 Integer 是一个 Number:Integer 类扩展了 Number 类。

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

所以这与拆箱没有太大关系。这与你不能做的事实有关

MyNumber n = someInteger;

就像你不能那样
MyNumber n = someString;

: 类型不兼容。

关于java - 为什么 Number 的自定义子级不继承自动装箱?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55780384/

10-11 19:24