У меня есть декоратор, который я хотел бы сделать родовым особым образом.Java generics: Вывод типа из другого метода?
Использование:
new ExceptionHandler() {
public <T extends IrcEvent> void doIt(T msg, IrcBotProxy pircBotProxy) throws Throwable {
plugin.onMessage(msg, pircBotProxy);
}
}.handle(msg, this.pircBotProxy);
Я хотел бы, чтобы T
быть infered от .handle(...)
, который получает определенный подтип - IrcEvMsg
.
Как это возможно? Или мне нужно параметризовать ExceptionHandler
с типом для использования? (Java 7)
Handler код: (не компилирует этот путь, - говорит "ExceptionHandler не implemetn doIt(...)
")
public abstract class ExceptionHandler {
public <T extends IrcEvent> void handle(/*IIrcPluginHook plugin,*/ T evt, IrcBotProxy pircBotProxy) {
try {
this.doIt(evt, pircBotProxy);
}
catch(NullPointerException ex) {
log.error("Plugin misbehaved: " + ex, ex);
}
catch (Throwable ex) {
if(System.getProperty("bot.irc.plugins.noStackTraces") == null) {
log.error("Plugin misbehaved: " + ex.getMessage(), ex);
} else {
log.error("Plugin misbehaved: " + ex);
if (ex.getCause() != null) {
log.error(" Cause: " + ex.getCause());
}
}
}
}
public abstract <T extends IrcEvent> void doIt(T event, IrcBotProxy pircBotProxy) throws Throwable;
}// class
Определить, что «не работает»? Я не понимаю, почему этого не будет (и я просто написал пример, используя '' для тестирования, и это работает отлично). –
У вас, похоже, есть неопределенная переменная 'plugin' в вашем анонимном классе. –
* говорит: «Исключительный манипулятор не реализует doIt (...) * ... Я бы предложил перепроверять/сохранить ваши файлы и сделать чистую/сборку. Это означало бы, что у вас есть несоответствующая подпись по сравнению с тем, что размещено здесь. –