Обойти статические методы диспетчеризации Java без шаблонов Double Dispatch / Visitor - PullRequest
3 голосов
/ 16 декабря 2008

Я использую класс 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 (класс, содержащий перегруженный метод)?

Ответы [ 2 ]

3 голосов
/ 16 декабря 2008

Конечно, вы всегда можете использовать рефлексию, чтобы найти наиболее конкретную версию применяемого метода, но это может очень быстро стать волосатым.

Но если эти два вызова приводят к совершенно разному поведению, то Foo либо предназначен для использования в шаблоне посетителя (т. Е. С двойной диспетчеризацией), либо он не работает.

2 голосов
/ 16 декабря 2008

Вы можете взглянуть на Java MultiMethod Framework . Это в значительной степени слой вокруг того, что вы предлагаете, но по крайней мере он абстрагируется в логический модуль, который не входит в ваши обязанности?

(Насколько я знаю, нет чистого способа сделать это, не прибегая к рефлексии / экземпляру взлома)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...