gpt4 book ai didi

java - 方法重载如何决定在以下情况下调用哪个版本的重载方法

转载 作者:行者123 更新时间:2023-12-01 06:42:05 26 4
gpt4 key购买 nike

在java中,我有2个重载方法,其中一个是主方法,因此我从主方法中调用重载方法。

public class Test {
public static void main(String[] args) throws IOException {
doSomething(null);
}
private static void doSomething(Object o) {
System.out.println("method with Object in signature is called.");
}
private static void doSomething(String s) {
System.out.println("method with String in the signature is called.");
}
}

当我运行这个java代码时,它将调用doSomething(String s)方法并打印

method with String in the signature is called.

我认为它会调用 doSomething(Object o) 方法,但它不会发生。

谁能更详细地向我解释一下,为什么会发生这种情况以及如何发生?

谢谢。

最佳答案

来自JLS 15.12.2.5 (强调):

If more than one member method is both accessible and applicable to a method invocation, it is necessary to choose one to provide the descriptor for the run-time method dispatch. The Java programming language uses the rule that the most specific method is chosen.

The informal intuition is that one method is more specific than another if any invocation handled by the first method could be passed on to the other one without a compile-time error.

任何可以传递给String方法的东西都可以传递给Object方法,同时也有一些东西可以传递给Object无法传递给 String 方法的 code> 方法(例如 new Object()) (*);因此 String 方法更加具体,因此选择了该方法。

<小时/>

(*) 该子句很重要:如果您将 Object 方法替换为:

private static void doSomething(Integer s) {

那么有些东西你可以传递给doSomething(String),但你无法传递给doSomething(Integer);有些东西可以传递给 doSomething(Integer),但无法传递给 doSomething(String)。在这种情况下,两者都不更具体,因此方法调用将被视为不明确。

关于java - 方法重载如何决定在以下情况下调用哪个版本的重载方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59842234/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com