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

标签 java numbers wrapper primitive autoboxing

我知道 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/

相关文章:

c - C中的长随机数

python - 我可以把它写成包装器吗?

PE (.exe) 周围的 Java 包装器

java - 如果我将 .svn 目录从 ASCII 转换为 UTF-8 会怎样?

java - 使用 repaint() 时绘制图形而不删除它们

Android:带数字的可绘制资源。可能吗?

html - CSS Wrapper div 不工作

java - WebLogic 集群 - 每周重新启动所有应用程序服务器实例?

java - 如何保持 Google App Engine 的运行实例

java - <f :convertNumber> use the right number separator when using patterns to format currency?