我知道 Java 不支持自定义自动装箱,但我也注意到我可以扩展 Number 对象。由于数字对象本身似乎允许对基元进行自动装箱,因此这是可行的:
数字 val = 5;//这样编译没问题
但是,如果我扩展 Number 并尝试使用子类型,程序将无法编译:
MyNumber num = 5;//这不编译:(
我知道这是不允许的,而且可能永远不会在 Java 中被允许,但是是什么机制导致了这种不连续性的发生? Number 的包装器功能是在类本身之外的某个地方处理的,还是可能有一些特殊的封装阻止了自定义包装器的创建?
最佳答案
5 是整数文字。因此它的类型是int
。
因为它被分配给一个引用类型(数字)的变量,它被自动装箱到它的包装器类型:java.lang.Integer
。然后将此 Integer 分配给变量,这是有效的,因为 Integer
是一个 Number:Integer 类扩展了 Number 类。
相反,Integer 不扩展 MyNumber。因此,将 Integer 赋值给 MyNumber
类型的变量是无效的:Integer 不是 MyNumber。
所以这和开箱没有太大关系。这与你不能做的事实有关
MyNumber n = someInteger;
就像你不能那样
MyNumber n = someString;
:类型不兼容。
关于java - 为什么 Number 的自定义子项不继承自动装箱?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55780384/