в том, что для этого тебе придется где-то объявить связи и кода-то меньше не станет. Добавь ко второму варианту
Map<Class, Function> map = new HashMap<>();
map.put(A.class, (args) -> ...))
map.put(B.class, (args) -> ...))
map.put(C.class, (args) -> ...))
map.put(D.class, (args) -> ...))
map.put(E.class, (args) -> ...))
map.put(F.class, (args) -> ...))
map.put(G.class, (args) -> ...))
(ну или список из Pair<Class, Function>, без разницы)
И это хорошо если у тебя аргументы совпадат, иначе сделаешь годобджект Context
в котором будет куча мусора. Нафига такое плодить?
Если аргументы не совпадают, то никакого простого решения я тоже не вижу - придётся городить мутный огород, да.