【发布时间】:2026-02-22 05:50:02
【问题描述】:
鉴于这段代码
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");}
}
这是我得到的输出:
整数 细绳 目的 目的我不明白为什么在最后两种情况下调用foo(Object o),而不是foo(int i) 和foo(String s)。
三元表达式的返回类型不是在运行时计算的吗?
编辑:
让我困惑的是断言
System.out.println((y>5) ? 21 : "Zebra");
编译是因为(OCA 学习指南 - Sybex):
System.out.println() 并不关心语句是完全不同的类型,因为它可以将两者都转换为 String
重点是 println 被重载以接受 Object 类型作为输入。相当误导,恕我直言。
【问题讨论】:
-
重载分辨率总是在编译时确定。
-
@Radiodef OP 询问为什么三元运算符的结果是
Object而不是int或String。 -
@LuiggiMendoza 那么为什么它应该是
int或String而不是Object? OP 表示他们认为应该在运行时评估该类型,但事实并非如此。要使结果为int或String,因此必须在编译时评估条件,并且在大多数情况下这是不可能的。考虑到我之前的评论,程序的行为应该是合理的。 -
是的,你说得对,这本书误导了你。
-
@LouisWasserman 这不是唯一的误导性信息......另一个,我会把它点燃!而且是甲骨文自己建议的……
标签: java type-conversion ternary-operator