假设我有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匹配“。
答案 0 :(得分:1)
您的示例没有区别,因为您将123L
分配给value
。
如果值来自其他地方,那么主要区别在于Number
不是java.lang.Long
时第一个断言会失败,而Number
接口的某些其他实现会失败。第二个断言将对任何Number
成功,包括Integer
,Double
等。
内部获取值的方式之间存在差异:
longValue
是Number
接口的成员,因此它是一个没有强制转换的虚拟呼叫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();
中定义了Long
到long
的转换时执行的取消装箱转换:
如果r是Long类型的引用,则取消装箱转换会转换r 进入r.longValue()