Java强制类型转换困惑

4

请问为什么以下类型转换会导致编译时错误:

Long l = (Long)Math.pow(5,2);

但是为什么不使用以下方式:
long l = (long)Math.pow(5,2);

最好包含编译器错误,这样更容易理解。 - Dan
3个回答

10

Math.pow(5,2) 返回的是一个 double 类型的值,可以强制转换为 long 类型,但不能强制转换为 Long 类型。

但是,由于 自动装箱 可以在 longLong 之间进行转换,因此这也是可行的。

Long l = (long)Math.pow(5,2);

总之,你可以将 double --> longlong --> Long 转换,但不能将 double --> Long 转换。


Math.pow(a,b) 是一个 double。正如你所提到的,自动装箱会解决这个问题。 - Dan
@Martin - 只是一个随机类型的问题(顺便加1分给答案)- 因为原始类型派生自对象,所以这在C#中是否可行? - JasCav

4

你不能直接将基本数据类型(例如 double)转换为对象。这不是Java的工作方式。有些情况下,语言可以自动为你应用适当的对象创建,例如函数调用参数。


2
浏览器?你是指Java运行时引擎吗? - Lawrence Dol
1
你可以直接将基本类型double转换为对象Double。 - Carl
糟糕,谢谢@Monkey!现在有装箱/拆箱,但它有点邪恶,我更喜欢把头埋在沙子里不看它 :-) - Pointy

1

因为原始类型在所有方面都不是对象,即使Java添加了一些解决方法(例如这些类型的隐式拆箱)。

您可以通过各种方式来解决它,例如:

Long l3 = ((Double)Math.pow(5, 2)).longValue();

这能够正常工作是因为Java具有以下能力:

  • 在使用普通类型声明时,能够从原始类型隐式转换为另一种原始类型,例如:从 int 转换到 long
  • 能够从装箱类型隐式转换为另一个装箱类型,例如:从 Int 转换到 Long
  • 当它们是相同类型时,能够在装箱和未装箱类型之间进行切换,例如:从 long 转换到 Long

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接