我有
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 dispatch和 visitor pattern .
就我个人而言,我不太喜欢这个。我更喜欢尝试围绕它进行设计。当然,这并不总是可能的,但至少值得尝试。
关于Java方法重写/接口(interface)问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1104991/