JAVA / Исследуем multiple dispatch на HotSpot

Пост из серии «будни перформанс-инженеров». Иногда в проектах возникает необходимость сделать т.н. multiple dispatch: возможность вызвать конкретный метод, основываясь на типах аргументов.

Например, есть два метода:

 class Caller {
     public void doSomethingNasty(A aInstance) { ... };
     public void doSomethingNasty(B aInstance) { ... }
 }

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

 class A extends Base { ... }
 class B extends Base { ... }

 class Caller {
     public void pleaseDoThat(Base instance) {
         doSomethingNasty(instance); // compile error
     }
 }

В Java подобный код вызовет ошибку компиляции, ибо нефиг. Что делать, если всё-таки надо? Значит, нужно в рантайме определить нужный метод.

Рубрика: Habr