【发布时间】:2014-04-30 16:37:19
【问题描述】:
最近遇到一个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 相同的实例,为什么它给了我不同的?
非常感谢您的帮助。
【问题讨论】:
-
条件运算符的结果类型不能超过一个,总是一个,在编译时决定。
-
如果您将两个结果都转换为 Number,那么它应该可以按预期工作。上面的应该给出一个编译错误,因为Integer不能转换为Long,但是javac做了一些奇怪的事情。
-
这是一个很好的例子,说明为什么不应该使用三元运算符;因为你不懂三元运算符。只需使用 if 语句,因为 a) 你理解它 b) 它被初级 Java 开发人员理解(而三元则不是)
标签: java