java - 我新建了一个 Integer 实例,但它给了我一个 Long 实例

标签 java

最近遇到一个Java的陷阱,代码在这里:

    Number value = new Integer(10);
    value = value instanceof Long ? new Long(-value.longValue()) : new Integer(-value.intValue());

    System.out.println(value instanceof Integer);
    System.out.println(value.getClass());

我认为输出是:

真实
java.lang.Integer 类

但是,我错了,正确的输出恰恰相反:


java.lang.Long 类

我不明白为什么。所以我使用javap -c反汇编类文件,以下两行(指令)对我来说很奇怪:

50: i2l           
51: invokestatic  #10                 // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
为什么?我想要与对象 value 相同的实例,为什么它给了我不同的结果?

非常感谢您的帮助。

最佳答案

三元运算符接受两个操作数,即new Long(-value.longValue())new Integer(-value.intValue() )

根据Java语言规范http://docs.oracle.com/javase/specs/jls/se8/html/jls-5.html#jls-5.6.2 ,两个操作数将首先被拆箱(Long->long)和(Integer->int),参见 http://docs.oracle.com/javase/specs/jls/se8/html/jls-5.html#jls-5.1.8 ,然后应用以下规则:

如果其中一个操作数为 double 类型,则另一个操作数将转换为 double。 否则,如果任一操作数的类型为 float,则另一个将转换为 float。 否则,如果任一操作数的类型为 long,则另一个将转换为 long。 否则,两个操作数都转换为 int 类型。

由于拆箱步骤之后,其中一个操作数的类型为 long,因此另一个操作数将转换为 long。这应该可以解释你的结果。

关于java - 我新建了一个 Integer 实例,但它给了我一个 Long 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23393564/

相关文章:

Java 空指针异常(单击时)

java - Android TextView Marquee 以编程方式

java - Gurobi:如何添加约束x1*x2*x3

java - NetBeans 不会从远程位置下载,但测试 FTP 使我成功

java - 如何使用 Spring Boot 从 cassandra 检索空集

Spring 中的 Java 8 Optional<?> 验证解包器

Java POI 最后的 CellStyle 覆盖以前的 CellStyles

java - char和int数组的区别

java - Jackson 对象映射器在响应中包含转义序列

java - 无法实例化私有(private)类