有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java三元运算符如何计算结果数据类型?

考虑到这段代码

public class Main {

    public static void main(String[] args) {
        foo(1);
        foo("1");
        foo(true?1:"1");
        foo(false?1:"1");
    }

    static void foo(int i){System.out.println("int");}
    static void foo(String s){System.out.println("String");}
    static void foo(Object o){System.out.println("Object");}
}

这是我得到的输出:

int
String
Object
Object

我不明白为什么在最后两种情况下调用foo(Object o),而不是foo(int i)foo(String s)。 三元表达式的返回类型不是在运行时计算的吗

编辑:

让我困惑的是这样的断言

System.out.println((y>5) ? 21 : "Zebra");

编译是因为(OCA研究指南-Sybex):

The System.out.println() does not care that the statements are completely differnt types, because it can convert both to String

重点是,println被重载,以接受对象类型作为输入。很误导人,伊姆霍


共 (1) 个答案

  1. # 1 楼答案

    Isn't the return type for a ternary expression evaluated at runtime?

    不,绝对不是。这与Java的工作方式截然不同,Java总是在编译时执行重载解析等操作。如果没有将结果传递给方法,但试图将其分配给变量,您会期望发生什么?你会声明什么样的变量

    表达式的类型由JLS 15.25的规则控制。在这两种情况下,第三个操作数都是String类型,这导致它是一个参考条件表达式,因此应用表15.25-E,结果是lub(Integer,Object)lub部分指的是JLS 4.10.4,这相当令人困惑——这里的类型与Object不完全相同,但在大多数情况下可以这样考虑