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 因此出现错误。
首先,请注意 BigInteger
是 java.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
但是,有一个 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 不支持运算符重载,因此您需要使用它的方法和构造函数,而不是可以使用的简单算术运算符基元。
在修复
Integer y = 3;
但是对 BigInteger
做同样的事情并不能编译:
BigInteger x = 3;
-> "Type mismatch: cannot convert from int to BigInteger"
BigInteger
没有自动装箱吗?如果不是,支持自动装箱的类型的规则是什么?为什么不包括 BigInteger
?
自动装箱在基元和它们相应的包装器之间工作 class。由于 BigInteger
不完全是 int
的包装器 class 因此出现错误。
首先,请注意 BigInteger
是 java.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
但是,有一个 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 不支持运算符重载,因此您需要使用它的方法和构造函数,而不是可以使用的简单算术运算符基元。