我被引导相信 java 编译器在编译时完成了方法选择的所有工作(或者我错了吗?)。也就是说,它将在编译时通过检查类层次结构和方法签名来准确决定在哪个类中使用哪个方法。然后在运行时所需要做的就是选择要调用其方法的对象,这只能向上继承链。
如果是这样,它是如何工作的?
int action = getAction ();
StringBuilder s = new StringBuilder()
.append("Hello ") // Fine
.append(10) // Fine too
.append(action == 0 ? "" : action); // How does it do this?
这里,参数的类型可以是String
或int
。它如何在编译时决定应该调用 StringBuilder
的哪个方法?
最佳答案
一个表达式,例如
action == 0 ? "" : action
可以有一个单一的返回类型。编译器将其理解为返回 Object
实例的表达式。这在运行时可以是 String
或 Integer
。
在您的情况下,将调用 append(Object)
。然后,StringBuilder 实现将在参数上调用 toString()
,这将为您提供预期的结果(""
或转换为 String 的整数值)。
关于java - 编译时的方法选择。如果参数可以有多种类型怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8355245/