我有

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的一个实例

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

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

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

我想使用FooI方法作为后备来处理以后可以实现的类,并且我也想处理f而又没有一个大的功能来对所有当前已知的实现我的接口的类进行instanceof检查。

什么是这样做的好方法?

最佳答案

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

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

我个人并不喜欢这个。我更喜欢尝试围绕它设计自己的方式。当然,这并非总是可能的,但是至少值得尝试。

09-13 13:56