有如下代码:
class Random {
public static void main(String[] args) {
boolean f = true; // false
var randomClass = f ? new A() : new B();
randomClass.randomMethod();
}
}
class A {
public void randomMethod() {
System.out.println("Method in class A");
}
}
class B {
public void randomMethod() {
System.out.println("Method in class B");
}
}
根据我的假设,它应该根据 f 初始化变量 randomClass 作为类 A 或 B 实例的引用变量。但实际上,上面的代码甚至无法编译。无论 f 的值如何,类型推断都会为变量 randomClass 分配一个引用,该引用不是对类 A 或 B 的实例,而是对类 Object 的实例。由于 randomMethod() 方法未在 Object 中定义,因此代码本身无法编译。
为什么会发生这种情况?从逻辑的角度来看,三元运算符应该等同于以下表示法:
if (f) {
var randomClass = new A();
} else {
var randomClass = new B();
}
也就是说,根据 f,randomClass 必须引用类 A 的实例或类 B 的实例。
我不需要关于如何在不使用三元运算符的情况下实现此目的的替代解决方案。需要解释为什么三元运算符会产生这样的结果。


