gpt4 book ai didi

java - 多态性 - 模棱两可的错误

转载 作者:行者123 更新时间:2023-11-30 09:21:24 25 4
gpt4 key购买 nike

我昨天问了一个类似的问题,但是出现了另一个问题。

class Cat {
public void isClawedBy(Cat c, Kitten k){
System.out.println("Clawed by a cat");
}
}

class Kitten extends Cat{
public void isClawedBy(Kitten k, Cat c){
System.out.println("Clawed by a Kit");
}
}


Cat g = new Cat();
Cat s = new Kitten();
Kitten t = new Kitten();

g.isClawedBy(s,t);
s.isClawedBy(t,s);
t.isClawedBy(t,t);

我感到困惑的问题是 t.isClawedBy(t,t);。我知道 s.isClawedBy(t,s); 会抛出错误,因为 s 是静态类型 cat。

但是 t.isClawedBy(t,t); 抛出“方法 isClawedBy(Kitten, Cat) 对于 Kitten 类型不明确”错误。如果我将代码更改为 t.isClawedBy(s,t);t.isClawedBy(t,s); 它有效,但不确定为什么它不起作用对于(t,t)。

提前致谢

最佳答案

在 Java 中,方法调用是动态解析的。当你调用一个方法时,JVM 会尝试找到一个与签名匹配的方法,即方法名称、参数类型和返回类型。它通过查看所用类的方法表来完成此操作,该表也将包含父类(super class)型的方法签名。

在检查方法表中的签名是否合适时,它会考虑参数(和返回)类型的父类(super class)型。在t.isClawedBy(t,t)的情况下我们有两个方法可以匹配为 Kitten 中定义的方法与 Cat 中定义的匹配匹配 - 请注意,这些是不同的方法,因为它们具有不同的参数类型。

由于两个不同的方法匹配,所以方法调用是不明确的

对于 isClawed(s,t)isClawed(t,s)没有歧义 s是小猫,不能是猫。

关于java - 多态性 - 模棱两可的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17034116/

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