java没有BigInteger的自动装箱?
在修复this question的代码时,我意识到自动装箱并不适用于所有类型。此代码编译:
Integer y = 3;
但对BigInteger
执行相同操作不会编译:
BigInteger x = 3;
->;“类型不匹配:无法从int转换为BigInteger”
BigInteger
是否没有自动装箱?如果没有,支持自动装箱的类型的规则是什么?为什么不包括BigInteger
你可以在下面搜索框中键入要查询的问题!
在修复this question的代码时,我意识到自动装箱并不适用于所有类型。此代码编译:
Integer y = 3;
但对BigInteger
执行相同操作不会编译:
BigInteger x = 3;
->;“类型不匹配:无法从int转换为BigInteger”
BigInteger
是否没有自动装箱?如果没有,支持自动装箱的类型的规则是什么?为什么不包括BigInteger
# 1 楼答案
阅读
BigInteger
的文档。您将看到,它不需要自动装箱,因为它已经是一个类,而不是一个原语。要实现所需功能,请查看BigInteger
类中提供的方法,尤其是静态BigInteger.valueOf()
方法:BigInteger x = BigInteger.valueOf(3);
# 2 楼答案
让我提出一个问题来回答:
BitInteger的思想是表示任意精度的整数。您究竟打算如何将这样一个类的对象“取消绑定”到现有的基元类型中
# 3 楼答案
自动装箱在原语及其对应的包装类之间工作。由于
BigInteger
并不完全是int
的包装类,因此出现了错误# 4 楼答案
Juned和hexafraction已经指出,自动装箱在原语和它们相应的包装器之间工作
至于为什么
BigInteger
没有相应的原语,这相当于回答了你的第二个问题:原语是CPU支持的变量,可以直接操作
BigInteger
这是不可能的。这是一个支持大量操作的类,此类操作需要大量的管理每台现代计算机都有一条整数加法的机器语言指令。因此,它在JVM中也可以有非常简单的字节码。像
BigInteger
这样的复杂类型不能以这种方式处理,也不能转换为简单的字节码。因此,它不能是原始的因为它是一个类,而且Java不支持运算符重载,所以需要使用它的方法和构造函数,而不是可以与原语一起使用的简单算术运算符
# 5 楼答案
首先,请注意
BigInteger
是java.math
的一部分,而不是java.lang
,因此不会受到语言的特殊对待。所有装箱类型都在java.lang
中,因此Java语言可能会对它们进行特殊处理。这样的考虑可以包括装箱、常量池中的字符串、内存特定区域中的类对象等其次,一份名为Java Language Specification(简称JLS)的参考文件准确地描述了这一点:
Source
然而,有一个request允许自动装箱
BigInteger
,并在应用于BigInteger
对象时赋予各种数学运算符特殊意义