Java方法重写/接口(interface)问题

标签 java interface

我有

interface FooI
class FooA implements FooI
class FooB implements FooI
class FooC implements FooI

我编写了一个“Handler”类,它具有以下方法

static double handle(FooA f)
static double handle(FooB f)
static double handle(FooI f)

我有一个如下所示的函数:

void caller(FooI f)
{
    Handler.handle(f);
}

f 只是被称为实现 FooI 的类。然而 f 是 FooA 的一个实例

调用 FooI 的方法,而不是调用 FooA 的方法。

当我使用 f.getClass().getName() 时,我得到了正确的类名 (FooA)。

我很困惑,因为我期望调用最适合的方法,即 FooA 的方法。

我想使用 FooI 方法作为后备来处理稍后可以实现的类,并且我还想在没有一个大函数的情况下处理 f,我正在对当前所有函数进行 instanceof 检查实现我的接口(interface)的已知类。

执行此操作的好方法是什么?

最佳答案

重载解析是在 Java 中的编译时而不是执行时完成的。签名是根据变量的编译时类型选择的。仅覆盖在执行时确定。

在 Java 等语言中,常见的解决方案是使用 double dispatchvisitor pattern .

就我个人而言,我不太喜欢这个。我更喜欢尝试围绕它进行设计。当然,这并不总是可能的,但至少值得尝试。

关于Java方法重写/接口(interface)问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1104991/

相关文章:

java - JTable 列调整大小不起作用

java - 使用 Java Config 覆盖 Autowiring setter

java - JAVA创建对象时什么时候执行静态 block ?

java - 有没有办法检查某些生成的代码在不使用 Implements 关键字时是否遵循接口(interface)?

web-applications - 有可用的 HTML5 RIA 工具包吗?

Java 继承层次结构——实现父类(super class)正在实现的接口(interface)

android - 接口(interface)方法无法更改android中的TextView文本

java - Retrofit @Header 中的属性必须是常量

java - play 2 如何在测试时覆盖全局设置

c++ - 如何在同一位置的所有 Linux 发行版中找到包含 CPU 温度和风扇速度信息的文件?