1

我有一个装饰器,我想以一种特殊的方式使其通用。

用法:

            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)

处理程序代码:(不以这种方式编译 - 说“异常处理程序不实现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
4

2 回答 2

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

输出:

1

您声明您收到“ExceptionHandler 未实现 doIt(...)”的编译错误- 您需要重新检查您的代码并确保您传递了正确的参数,确保文件已保存,然后清理并重建您的项目。

于 2013-07-14T07:25:01.857 回答
-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在 in 中使用的与在中使用handle()的相同”TdoIt()

于 2013-07-14T07:04:00.323 回答