Java方法覆盖/接口问题

Kag*_*age 2 java interface

我有

interface FooI
class FooA implements FooI
class FooB implements FooI
class FooC implements FooI
Run Code Online (Sandbox Code Playgroud)

我写了一个类"Handler",它有以下方法

static double handle(FooA f)
static double handle(FooB f)
static double handle(FooI f)
Run Code Online (Sandbox Code Playgroud)

我有一个像下面这样的功能:

void caller(FooI f)
{
    Handler.handle(f);
}
Run Code Online (Sandbox Code Playgroud)

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

调用FooI的方法而不是调用FooA的方法.

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

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

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

这样做有什么好办法?

Jon*_*eet 16

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

Java等语言的常见解决方案是使用双重调度访问者模式.

就个人而言,我不是这个的忠实粉丝.我宁愿尝试设计自己的方式.当然,这并不总是可行,但至少值得尝试.