首页 > 解决方案 > 正确实现多态性,没有 Java 气味

问题描述

我构建了 2 个实现相同接口并根据实例类型执行不同逻辑的类。一些方法接收接口类型作为参数,并根据实例类型执行不同的逻辑。使用 instanceof 很容易做到这一点,但我需要做到这一点没有任何气味。

这是我尝试过的代码:

public class Concrete1 implements Interf{
    public boolean isMatch(Concrete1 s) {return true;}
    @Override
    public boolean isMatch(Interf s) {return false;}
}
public class Concrete2 implements Interf{
    public boolean isMatch(Concrete2 s) {return true;}
    @Override
    public boolean isMatch(Interf s) {return false;}
}

public static void main(String[] args) {
    Concrete1 c1=new Concrete1();
    Concrete2 c1=new Concrete2();
    Interf i1=new Concrete1();
    Interf i2=new Concrete2();
    System.out.println(c1.isMatch(c1));
    System.out.println(c1.isMatch(c2));
    System.out.println(i1.isMatch(i1));
    System.out.println(i1.isMatch(i2));
}

预期输出为:

true
false
true
false

相反,我得到:

true
false
false
false

标签: javapolymorphism

解决方案


唯一与您的期望不同的行是第三行,其结果是:

i1.isMatch(i1)

i1是对 an 的引用Interf,因此编译器选择采用 a 的方法Interf。它不能选择采用 a 的方法,Concrete1因为它只考虑存在于 type 上的方法Interf


推荐阅读