java - 多态性 - 歧义错误

标签 java polymorphism dispatch

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

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/

相关文章:

c# - 为什么 BackgroundWorker 总是很忙?

javascript - 了解 Dean Edwards 的附加事件 JavaScript

具有 getSize().width、getSize().height 的 Java 小程序

java - 带有子资源定位器的 Jersey 版本控制

c++ - 为什么在 C++ 中给定指向基类的指针时不调用派生类对象的重载函数?

oop - Fortran 2003,选择类型以区分 'real' 和 'real array'

java - 使用 Volley 预填充房间数据库

javascript - 将自定义消息身份验证代码从 Java 转换为 JavaScript

c++ - 我可以在不使用虚函数的情况下获得多态行为吗?

reactjs - Redux - reducer 与 Action 的关系