BigInteger 没有自动装箱?

No autoboxing for BigInteger?

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

Integer y = 3;

但是对 BigInteger 做同样的事情并不能编译:

BigInteger x = 3;

-> "Type mismatch: cannot convert from int to BigInteger"

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

自动装箱在基元和它们相应的包装器之间工作 class。由于 BigInteger 不完全是 int 的包装器 class 因此出现错误。

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

其次,一个名为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 对象时为各种数学运算符赋予特殊含义。

阅读 BigInteger 的文档。您会看到它不需要自动装箱,因为它已经是一个 class,而不是原始类型。要执行您想要的操作,请查看 BigInteger class 中提供的方法,尤其是静态 BigInteger.valueOf() 方法:

BigInteger x = BigInteger.valueOf(3);

让我来回答一个问题:

BitInteger 的思想是表示任意精度的整数。您如何将 "unbox" 这样 class 的对象准确地设想为现有的基本类型?

Is there no autoboxing for BigInteger?

Juned and hexafraction 已经指出自动装箱在 primitives 和它们相应的 Wrappers 之间工作。

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

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

原语是CPU支持直接操作的变量BigInteger这是不可能的。这是一个支持海量运算的class,而这样的运算需要相当多的管理

每台现代计算机都有用于整数加法的机器语言指令。因此它在JVM中也可以有非常简单的字节码。像 BigInteger 这样的 复杂类型不能那样处理 ,它不能被翻译成简单的字节码。因此,它不能是原始的。

由于它是 class 并且 Java 不支持运算符重载,因此您需要使用它的方法和构造函数,而不是可以使用的简单算术运算符基元。