gpt4 book ai didi

java - 转换为 Long 和调用 longValue 有什么区别?

转载 作者:行者123 更新时间:2023-11-30 08:37:54 27 4
gpt4 key购买 nike

假设我有一个 Number 类型的变量,分配了一个 long 类型的值。强制转换为 Long 然后转换为 long 与仅调用 longValue() 之间有区别吗?换句话说,下面的断言看到的有什么区别吗:

Number value = 123L;

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

其中 assertEquals 来自 org.junit 包。

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

类型转换注意事项:我知道 (Long) 转换是必要的,因为没有它编译器会出错。如果我只有 assertEquals(123L, (long)value),那么它会显示“java:不兼容的类型:java.lang.Number 无法转换为 long”。(long) 转换是必需的,因为需要重载 assertEquals。如果我只有 assertEquals(123, (Long)value),那么它会说“java: reference to assertEquals is ambiguous\both method assertEquals(java.lang.Object,java.lang.Object) in org.junit.Assert 和 org.junit.Assert 中的方法 assertEquals(long,long) 匹配。

最佳答案

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

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

内部获取值的方式有区别:

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

关于java - 转换为 Long 和调用 longValue 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36869186/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com