2013-07-14 2 views
1

У меня есть декоратор, который я хотел бы сделать родовым особым образом.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 
+0

Определить, что «не работает»? Я не понимаю, почему этого не будет (и я просто написал пример, используя '' для тестирования, и это работает отлично). –

+0

У вас, похоже, есть неопределенная переменная 'plugin' в вашем анонимном классе. –

+0

* говорит: «Исключительный манипулятор не реализует doIt (...) * ... Я бы предложил перепроверять/сохранить ваши файлы и сделать чистую/сборку. Это означало бы, что у вас есть несоответствующая подпись по сравнению с тем, что размещено здесь. –

ответ

-1

Вы должны определить 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()»

+0

Его код должен работать нормально: generics - вывод о том, как он это делает, совершенно легален. Реальная проблема, я подозреваю, связана с неопределенной переменной plugin в его классе anon. –

+0

Не совсем, я не хотел чтобы загромождать код, но есть 'для (окончательный плагин IIrcPluginHook: this.plugins) {' около этого. –

0

Нет проблем с выводом типа так, как вы это делаете. Вот очень простой пример, который показывает:

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" }))); 
    } 
} 

Выход:

Вы утверждаете, что вы получаете компиляции ошибка «ExceptionHandler не реализует doIt (...)» - вам нужно перепроверить свой код и убедиться, что вы передаете правильные параметры, убедитесь, что файлы сохранены, а затем очистку и восстановление вашего проекта.

+0

Хорошо, я попробую. –

Смежные вопросы