我构建了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
的方法。