Java泛型:从另一种方法中推断类型?

时间:2013-07-14 06:51:05

标签: java generics anonymous-inner-class

我有一个装饰师,我想以特殊方式制作通用。

用法:

            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 个答案:

答案 0 :(得分: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(...)” - 您需要重新检查代码并确保传递正确的代码params,确保文件已保存,然后清理并重建项目。

答案 1 :(得分:-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()相同”