Обобщения 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()"

Другие вопросы по тегам