3

Fooこれらのメソッドを提供するクラスを使用しています:

String overloadedMethod(Object)
String overloadedMethod(Goo)

Java はレシーバー以外の引数で静的にディスパッチするため、 my value(これは ですが、Object動的な type を持つ可能性があります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

もちろん、いつでもリフレクションを使用して、適用されるメソッドの最も具体的なバージョンを見つけることができますが、それはすぐに面倒になる可能性があります。

しかし、これら 2 つの呼び出しの結果がまったく異なる動作になる場合、Foo はビジター パターン (つまり、二重ディスパッチ) で使用するように設計されているか、壊れています。

于 2008-12-16T09:43:26.280 に答える
2

JavaMultiMethodFrameworkを見ることができます。それはあなたが提案しているものの周りのほとんどの層ですが、少なくともそれはあなたの責任ではない論理モジュールに抽象化されていますか?

(私が知る限り、ハッキングの反省/インスタンスに頼らずにこれを行うためのクリーンな方法はありません)

于 2008-12-16T10:21:17.500 に答える