为什么拆箱不起作用:未解决的编译错误:无法从double转换为Long?

Stu*_*ent 2 java unboxing

根据我的理解,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

Era*_*ran 8

Math.pow(10, 10)返回a double,可以自动装入a Double,而不是a Long.

如果显式地将结果转换为long,则编译器可以自动选择longto Long.

至于为何(Long) Math.pow(10, 10)不工作-从没有转换doubleLong在定义JLS.唯一支持的装箱转换是从基元到其对应的引用类型:

5.1.7.拳击转换

拳击转换将基本类型的表达式转换为引用类型的相应表达式.具体来说,以下九个转换称为装箱转换:

  • 从类型布尔值到类型布尔值

  • 从类型字节到类型字节

  • 从短类型到短类型

  • 从类型char到类型字符

  • 从int类型到Integer类型

  • 从类型long到类型Long

  • 从类型float到类型Float

  • 从double类型到Double类型

  • 从null类型到null类型


Sur*_*tta 6

你误解/混淆了铸造装箱/拆箱.它们都是不同的概念.

 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,因为它们都是一对基元和包装器.