gpt4 book ai didi

java - 为什么不选择子类类型的参数重载而不选择某些父类

转载 作者:行者123 更新时间:2023-11-30 02:51:31 25 4
gpt4 key购买 nike

public class Imp1 implements Inter1 {
private int num;

@Override
public void apply() {
num++;
}

public void doubler() {
num = num * 2;
}

public boolean equals(Imp1 o) {
if (!(o instanceof Imp1))
return false;
return o.num == num;
}

public int getNum() {
return num;
}

public static void main(String[] args) {
final Inter1 a = new Imp1();
final Imp1 b = new Imp1();
a.apply();
b.apply();
System.out.println("a equals b " + a.equals(b));
System.out.println("b equals a " + b.equals(a));
}

}

我希望 equals(Imp1 o) 被选为 a.equals(b)b.equals(a)< 的最佳候选者 为什么这里不是这样?

更详细地说 - 这段代码输出两次错误,我想知道为什么?a 和 b 持有 Imp1 对象,因此使用 Imp1 实例作为参数调用 equals 应该调用 equals(Imp1 o) ,它比 equals(Object o) 更适合,但我看到了正在调用 equals(Object o),最后代码打印两次 false,而不是两次 true。

最佳答案

方法重载决策由参数的编译时类型决定,因为编译器在编译时选择最佳匹配的方法签名。

仅当传递给方法的参数的编译时类型为 Imp1 的子类时,才能选择

equals(Imp1 o) Imp1.

a 不满足此条件,因此 b.equals(a) 调用 Objectequals .

对于a.equals(b),由于a的编译时类型不是Imp1,因此无法调用equals(Imp1 o) 方法(除非将其强制转换为 Impl1),因此它只能选择 Objectequals.

System.out.println("a equals b " + ((Imp1)a).equals(b));

将调用equals(Imp1 o)

关于java - 为什么不选择子类类型的参数重载而不选择某些父类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38502270/

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