在没有Double Dispatch / Visitor模式的情况下解决Java的静态方法调度问题

我正在使用提供这些方法的类Foo

 String overloadedMethod(Object) String overloadedMethod(Goo) 

由于Java静态调度非接收器参数,我不能只传递我的value (它是一个Object ,但可能有动态类型Goo )并依赖JVM动态选择“正确”方法。

这是我目前(丑陋)的解决方法:

 Object value = ...; Foo foo = new Foo(); if (value instanceof Goo) { Goo gooValue = (Goo) value; return foo.overloadedMethod(gooValue); // -> overloadedMethod(Goo) } else { return foo.overloadedMethod(value); // -> overloadedMethod(Object) } 

有没有更好的方法来做到这一点而不修改Foo的代码 (包含重载方法的类)?

当然,您总是可以使用reflection来查找适用的方法的最具体版本,但这可能会很快变得毛茸茸。

但是如果这两个调用导致完全不同的行为,那么Foo要么被设计为在访问者模式中使用(即具有双重调度),要么被破坏。

您可以查看Java MultiMethod Framework 。 它几乎是你提出的一个层面,但至少它被抽象成一个不是你的责任的逻辑模块?

(据我所知,如果不采用reflection/实例黑客攻击,没有干净的方法可以做到这一点)