有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java没有BigInteger的自动装箱?

在修复this question的代码时,我意识到自动装箱并不适用于所有类型。此代码编译:

Integer y = 3;

但对BigInteger执行相同操作不会编译:

BigInteger x = 3;

->;“类型不匹配:无法从int转换为BigInteger”

BigInteger是否没有自动装箱?如果没有,支持自动装箱的类型的规则是什么?为什么不包括BigInteger


共 (5) 个答案

  1. # 1 楼答案

    阅读BigInteger的文档。您将看到,它不需要自动装箱,因为它已经是一个类,而不是一个原语。要实现所需功能,请查看BigInteger类中提供的方法,尤其是静态BigInteger.valueOf()方法:

    BigInteger x = BigInteger.valueOf(3);

  2. # 2 楼答案

    让我提出一个问题来回答:

    BitInteger的思想是表示任意精度的整数。您究竟打算如何将这样一个类的对象“取消绑定”到现有的基元类型中

  3. # 3 楼答案

    自动装箱在原语及其对应的包装类之间工作。由于BigInteger并不完全是int的包装类,因此出现了错误

  4. # 4 楼答案

    Is there no autoboxing for BigInteger?

    Junedhexafraction已经指出,自动装箱在原语和它们相应的包装器之间工作

    至于为什么BigInteger没有相应的原语,这相当于回答了你的第二个问题:

    If not, what is the rule for the types supporting autoboxing and why isn't BigInteger included?

    原语是CPU支持的变量,可以直接操作BigInteger这是不可能的。这是一个支持大量操作的类,此类操作需要大量的管理

    每台现代计算机都有一条整数加法的机器语言指令。因此,它在JVM中也可以有非常简单的字节码。像BigInteger这样的复杂类型不能以这种方式处理,也不能转换为简单的字节码。因此,它不能是原始的

    因为它是一个类,而且Java不支持运算符重载,所以需要使用它的方法和构造函数,而不是可以与原语一起使用的简单算术运算符

  5. # 5 楼答案

    首先,请注意BigIntegerjava.math的一部分,而不是java.lang,因此不会受到语言的特殊对待。所有装箱类型都在java.lang中,因此Java语言可能会对它们进行特殊处理。这样的考虑可以包括装箱、常量池中的字符串、内存特定区域中的类对象等

    其次,一份名为Java Language Specification(简称JLS)的参考文件准确地描述了这一点:

    Boxing conversion converts expressions of primitive type to corresponding expressions of reference type. Specifically, the following nine conversions are called the boxing conversions:

    • From type boolean to type Boolean

    • From type byte to type Byte

    • From type short to type Short

    • From type char to type Character

    • From type int to type Integer

    • From type long to type Long

    • From type float to type Float

    • From type double to type Double

    • From the null type to the null type

    Source

    然而,有一个request允许自动装箱BigInteger,并在应用于BigInteger对象时赋予各种数学运算符特殊意义