Обобщения Java: выводить тип из другого метода?
У меня есть декоратор, который я бы хотел сделать универсальным по-особенному.
Использование:
new ExceptionHandler() {
public <T extends IrcEvent> void doIt( T msg, IrcBotProxy pircBotProxy ) throws Throwable {
plugin.onMessage( msg, pircBotProxy );
}
}.handle( msg, this.pircBotProxy );
Я хотел бы T
быть выведенным из .handle(...)
, который получает определенный подтип - IrcEvMsg
,
Как это возможно? Или мне нужно параметризовать ExceptionHandler
с типом для использования? (Java 7)
Код обработчика: (не компилируется таким образом - говорит "Exceptionhandler не реализован 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
2 ответа
Нет проблем с выводом типа так, как вы это делаете. Вот очень простой пример, который демонстрирует:
public abstract class ExceptionHandler
{
public <T extends List> void handle(T l) {
this.doIt(l);
}
public abstract <T extends List> void doIt(T l);
}
...
public class Demo
{
public static void main(String[] args)
{
new ExceptionHandler() {
@Override
public <T extends List> void doIt(T l)
{
System.out.println(l.size());
}
}.handle(new ArrayList<String>(Arrays.asList(new String[] { "hi" } )));
}
}
Выход:
1
Вы заявляете, что получаете сообщение об ошибке "ExceptionHandler не реализует doIt (...)" - вам необходимо перепроверить код и убедиться, что вы передаете правильные параметры, убедитесь, что файлы сохранены, затем очистить и восстановить ваш проект.
Вы должны определить T
в классе ExceptionHandler
уровень:
public abstract class ExceptionHandler<T extends IrcEvent> {
public void handle(T evt, IrcBotProxy pircBotProxy ) {}
public abstract void doIt( T event, IrcBotProxy pircBotProxy ) throws Throwable;
}
Это единственный способ сказатьT
используется в handle()
та же T
что используется в doIt()
"