3

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

String overloadedMethod(Object)
String overloadedMethod(Goo)

由于 Java 在 non-receiver 参数上静态分派,我不能只传递 my 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(包含重载方法的类)中的代码的情况下做到这一点?

4

2 回答 2

3

当然,您总是可以使用反射来找到适用的方法的最具体版本,但这可能会很快变得棘手。

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

于 2008-12-16T09:43:26.280 回答
2

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

(据我所知,如果不求助于反射/黑客实例,就没有干净的方法来做到这一点)

于 2008-12-16T10:21:17.500 回答