java - 正确实现多态性,没有 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
解决方案
唯一与您的期望不同的行是第三行,其结果是:
i1.isMatch(i1)
i1
是对 an 的引用Interf
,因此编译器选择采用 a 的方法Interf
。它不能选择采用 a 的方法,Concrete1
因为它只考虑存在于 type 上的方法Interf
。
推荐阅读
- java - Spark Cassandra 连接器 3.0.0 - 如何启用 DirectJoin - Java
- google-app-engine - appengine 中的应用程序大小突然变大了(转到 1.14)
- android - 如何在不被操作系统杀死的情况下运行长时间运行的后台进程?
- python - 将 ImmutableMultiDict 与新的 dict 版本的 python 一起使用
- javascript - d3 v6在点击时添加节点
- php - 为什么我的 PHP 脚本需要这么多时间?
- php - 如何重新启动 woocommerce webhook
- java - Spring Webflux 应用程序,无法获取 reactor.netty.http.client* 指标和 reactor.netty.connection.provider* 指标
- c++ - 如何在简单示例中使用 WinRM C++ API
- reactjs - reactjs中如何创建ssr