我有一个装饰师,我想以特殊方式制作通用。
用法:
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
答案 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()
相同”