强制转换为Long并调用longValue有什么区别?

时间:2016-04-26 15:20:48

标签: java

假设我有Number类型的变量,分配了long类型的值。转换为Long然后转换为long,只是调用longValue()之间有区别吗?换句话说,以下断言之间是否有任何区别:

Number value = 123L;

assertEquals(123L, (long)(Long)value);
assertEquals(123L, value.longValue());

其中assertEquals来自org.junit包。

我对java下的java,字节码或者强制转换和longValue类型方法的实际实现知之甚少。我唯一确定的是,如果值不是long,那么转换将抛出异常,而调用将转换值并可能截断。

关于演员表的说明: 我知道(Long)强制转换是必要的,因为没有它,编译器会给出错误。如果我只有assertEquals(123L, (long)value),那么它说“java:不兼容的类型:java.lang.Number不能转换为long”。 (long)强制转换对于需要assertEquals的重载是必要的。如果我只有assertEquals(123, (Long)value),那么在org.junit.Assert和方法assertEquals(long ()org.junit.Assert匹配“。

2 个答案:

答案 0 :(得分:1)

您的示例没有区别,因为您将123L分配给value

如果值来自其他地方,那么主要区别在于Number不是java.lang.Long时第一个断言会失败,而Number接口的某些其他实现会失败。第二个断言将对任何Number成功,包括IntegerDouble等。

内部获取值的方式之间存在差异:

  • 方法longValueNumber接口的成员,因此它是一个没有强制转换的虚拟呼叫
  • 转换为Long需要进行类型检查,以确保该对象确实是Long,这是在运行时可能失败的转换。完成转换后,Java编译器调用longValue方法对long原语进行第二次转换。

答案 1 :(得分:1)

如果value是 Set objShell = CreateObject("WScript.Shell") If(objShell.SendKeys ("{Esc}") == "1")Then WScript.echo "del pressedd" End If 类型的变量并引用类型为Number的实例,那么这两个语句:

Long

是等价的。

(long)(Long)value; value.longValue(); 中定义了Longlong的转换时执行的取消装箱转换:

  

如果r是Long类型的引用,则取消装箱转换会转换r   进入r.longValue()