我有
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 dispatch和visitor pattern。
我个人并不喜欢这个。我更喜欢尝试围绕它设计自己的方式。当然,这并非总是可能的,但是至少值得尝试。