Я придумал решение, которое может работать в вашем сценарии, но она работает немного иначе, чем то, что вы изначально хотели решить (разрешающую из super
вызовов):
public class OpenInitialHandler extends InitialServerLegacyDelegate {
public OpenInitialHandler(BungeeCord bungee, ListenerInfo listener) {
super(bungee, listener);
}
public OpenInitialHandler(ProxyServer proxyServer, ListenerInfo listener) {
super(proxyServer, listener);
}
}
public class InitialServerLegacyDelegate /* implements and extends whatever you need */ {
private static final Constructor<InitialDelegate> targetConstructor = InitialServer.getConstructors()[0];
private final InitialServer delegate;
protected InitialServerLegacyDelegate(BungeeCord bungee, ListenerInfo listener) {
this(bungee, listener);
}
protected InitialServerLegacyDelegate(ProxyServer proxyServer, ListenerInfo listener) {
try {
// This is the critical part.
// Instead of binding/checking the constructor parameter types
// at compile-time, this will be resolved at runtime.
delegate = targetConstructor.newInstance(proxyServer, listener);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
// implement all neccessary interface methods here
// and simply make them delegate methods
}
По существу, InitialServerLegacyDelegate
обрабатывает это наследие. Похоже, действительный суперкласс (поскольку он реализует те же интерфейсы, как InitialServer
, но в действительности это всего лишь делегаты всех вызовов к экземпляру InitialServer
которые он решает во время выполнения
Одна из проблем, вы можете быть облицовкой:. Если ваш класс получает входной сигнал на OpenInitialHandler(ProxyServer proxyServer, ListenerInfo listener)
, где ProxyServer
не типа BungeeCord
. В этом случае, реализация потерпит неудачу с ClassCastException
, если новая зависимость (с BungeeCord
конструктора) присутствует и он получает не- BungeeCord
-input.
Методы делегата могут быть легко созданы Eclipse. Более подробно см. this question on how to generate delegate methods in Eclipse.