Java 为什么拆箱不&x27;t工作:未解决的编译错误:无法从双精度转换为长精度?

Java 为什么拆箱不&x27;t工作:未解决的编译错误:无法从双精度转换为长精度?,java,unboxing,Java,Unboxing,据我所知,Java自动处理自动装箱和取消装箱,即原语到对象包装的转换,反之亦然。然而,在下面的代码中,取消装箱似乎不起作用 public class TestMath { public static void main(String[] args) { Long resultLong = (Long) Math.pow(10, 10); System.out.println(resultLong); } } 上面的代码给了我编译错误,直到我通过将

据我所知,Java自动处理自动装箱和取消装箱,即原语到对象包装的转换,反之亦然。然而,在下面的代码中,取消装箱似乎不起作用

public class TestMath {
    public static void main(String[] args) {
        Long resultLong = (Long) Math.pow(10, 10);
        System.out.println(resultLong);
    }
}
上面的代码给了我编译错误,直到我通过将(Long)替换为(Long)手动取消装箱。我想了解这背后的原因

编译错误如下所示:

线程“main”java.lang中出现异常。错误:未解析编译 问题:无法从双掷到长掷

Math.pow(10,10)
返回一个
double
,它可以自动装箱成
double
,而不是
Long

如果将结果显式强制转换为
long
,编译器可以将
long
自动装箱为
long

至于为什么
(Long)Math.pow(10,10)
不起作用-没有定义从
double
Long
的转换。唯一受支持的装箱转换是从原语到其相应的引用类型:

5.1.7。装箱转换

装箱转换将基元类型的表达式转换为引用类型的相应表达式。具体而言,以下九种转换称为装箱转换:

  • 从布尔类型到布尔类型

  • 从类型字节到类型字节

  • 从短型到短型

  • 从类型char到类型char

  • 从int类型到Integer类型

  • 从long类型到long类型

  • 从类型float到类型float

  • 从double类型到double类型

  • 从空类型到空类型


你误解/混淆了施法和装箱/拆箱。它们都是不同的概念

 Math.pow(10, 10)
返回一个double,装箱/取消装箱发生在相应的原语和包装器之间(
int Integer
long
)。不适用于其他类型(
double Long


由于您正试图将一个double赋值给long值,编译器将给出错误。然而,分配给双重工作

Double resultLong =   Math.pow(10, 10);

在上面的一行中,pow方法实际上返回类型
double
,并将转换为double,因为它们都是一对原语和包装器。

编译错误到底是什么,在哪一行?请让我们尽可能容易地帮助你…@JonSkeet-我已经发布了编译错误。它位于Long resultLong=(Long)Math.pow(10,10)行;好的,谢谢。今后的问题请记住这一点。请注意,您的代码不会尝试执行任何取消装箱操作,顺便说一句。
Autoboxing
意味着将原始类型long转换为
java.lang.long
类<代码>取消装箱表示从
Long
转换为Long。您不能将double隐式转换为long。“由于您试图将double赋值为long,编译器会给出错误。但是,强制转换的工作方式与允许的强制转换类型相同。”不,编译器错误明确指出问题出在强制转换上。@AndyTurner My bad。更正。谢谢你。