【发布时间】:2017-04-12 05:15:58
【问题描述】:
请考虑我们有以下代码:
Object obj = true ? new Integer(0) : new Long(1);
System.out.println(obj.getClass() + "\nvalue = " + obj);
它的结果是:
class java.lang.Long
value = 0
代替:
class java.lang.Integer
value = 0
有人能解释一下为什么我们在 Java 中有这样的功能吗?这对我来说很奇怪。 你有什么有用的例子吗?
更新: 这是一段字节码,我们可以看到那里发生了什么
NEW java/lang/Integer
DUP
LDC "0"
INVOKESPECIAL java/lang/Integer.<init> (Ljava/lang/String;)V
INVOKEVIRTUAL java/lang/Integer.intValue ()I
I2L
INVOKESTATIC java/lang/Long.valueOf (J)Ljava/lang/Long;
ASTORE 1
【问题讨论】:
-
为了使三元语句有效,双方都应该返回相同类型的值
-
@PeterLawrey
Object o = false ? new Long(0) : new Integer(1);也将返回class java.lang.Long和1。不是最后一个参数的类型,而是加宽可以接收的类型。 -
我喜欢研究不周的问题得到很多支持。但是现在阅读 JLS 要求太多了……
-
澄清一下,这是Why does the ternary operator unexpectedly cast integers?的副本,而不是另一个。
标签: java