我昨天问了一个类似的问题,但又出现了另一个问题。
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
中定义的方法匹配。 code> 匹配 - 请注意,这些是不同的方法,因为它们具有不同的参数类型。
由于两个不同的方法匹配,因此方法调用不明确。
对于 isClawed(s,t)
和 isClawed(t,s)
来说,没有歧义,因为 s
是一只 Kitten,不能是一只猫。
关于java - 多态性 - 歧义错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17034116/