根据我的理解,Java自动处理Autoboxing和Unboxing,即将Primitives转换为Object Wrappers,反之亦然.但是,取消装箱似乎不适用于下面的代码.
public class TestMath {
public static void main(String[] args) {
Long resultLong = (Long) Math.pow(10, 10);
System.out.println(resultLong);
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码给我的编译错误,直到我做手工拆箱通过更换(长)与(长).我想了解这背后的原因.
编译错误如下所示:
线程"main"中的异常java.lang.Error:未解决的编译问题:无法从double转换为Long
Math.pow(10, 10)返回a double,可以自动装入a Double,而不是a Long.
如果显式地将结果转换为long,则编译器可以自动选择longto Long.
至于为何(Long) Math.pow(10, 10)不工作-从没有转换double到Long在定义JLS.唯一支持的装箱转换是从基元到其对应的引用类型:
5.1.7.拳击转换
拳击转换将基本类型的表达式转换为引用类型的相应表达式.具体来说,以下九个转换称为装箱转换:
从类型布尔值到类型布尔值
从类型字节到类型字节
从短类型到短类型
从类型char到类型字符
从int类型到Integer类型
从类型long到类型Long
从类型float到类型Float
从double类型到Double类型
从null类型到null类型
你误解/混淆了铸造和装箱/拆箱.它们都是不同的概念.
Math.pow(10, 10)
Run Code Online (Sandbox Code Playgroud)
返回一个double,并在各个基元和包装器(int <=> Integer,long <=> Long)之间发生装箱/拆箱.不与其他类型(double <!=!> Long).
由于您尝试将double赋值为long,因此编译器会给您错误.但是分配给Double工作.
Double resultLong = Math.pow(10, 10);
Run Code Online (Sandbox Code Playgroud)
在上面的行中,pow方法实际上返回了类型,double并且将转换为Double,因为它们都是一对基元和包装器.