我构建了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

最佳答案

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

i1.isMatch(i1)


i1是对Interf的引用,因此编译器选择采用Interf的方法。它不能选择采用Concrete1的方法,因为它仅考虑类型为Interf的方法。

08-25 01:43