为什么在这种情况下会选择doAction(A a)
?
您能否根据参数类型向一些文章提供有关方法选择的建议?
class A { }
class B extends A { }
class D {
void start(A a){
doAction(a);
}
void doAction(A a) {
System.out.println("A action");
}
void doAction(B b) {
System.out.println("B action");
}
}
public class Test {
public static void main(String[] args) {
new D().start(new B());
}
}
答案 0 :(得分:4)
为什么在这种情况下会选择行动(A)?
因为这是唯一适用的方法。根据编译时类型的参数,在编译时执行重载分辨率。
doAction(B)
方法不适用,因为没有从A
(您的参数类型)到B
(参数类型)的隐式转换。您可以将值转换为B
,如下所示:
doAction((B) a);
此时这两种方法都适用,但重载决策会选择doAction(B b)
作为特定而不是doAction(A a)
。当然,如果您将不是的引用传递给B
的实例,它也会失败。
您应该阅读JLS 15.12.2以了解重载解析的详细信息。