Java 重载一个方法时会发生什么,该方法的参数是从其他方法获取的参数的子类型?

What happens in Java overloading a method that has a param a subtype of the param taken from the other method?

标题有点乱,我举个例子解释一下。
假设我有两个 类:

class Parent {} 

class Child extends Parent {} 

然后我在其他地方定义了一个方法,它有一个 Parent 类型的参数,像这样:

public void doSomething(Parent parameter) {...}

由于多态性,我还可以向上面的方法传递类型为 Child 的 object,因为它扩展了 Parent。

现在让我们做一个重载

public void doSomething(Parent parameter) {...}

public void doSomething(Child parameter) {...}

然后在代码的其他部分调用 doSomething 传递类型为 Child

的参数
Child myElement = new Child();
doSomething(myElement);

在这种情况下,两个重载方法都是有效的,因为 Child 类型的元素可以传递给两者。
会叫哪一个?

我写了一个测试,好像执行了第二个(输入参数类型为Child的那个),对我来说也有意义,但我想知道如果它是一个定义明确的行为,或者可以根据例如 jvm 实现或这两种方法的声明顺序或随机等而有所不同。

一般来说,参数最具体的方法会被调用。在您的示例中,采用 Child 的方法比采用 Parent 的方法更具体,因此调用的是前者。

actual rules 有点复杂,但定义明确并且是语言规范的一部分。有效的编译器或 JVM 必须遵循这些规则。