Java泛型:从另一个方法推断类型?
我有一个装饰师,我想用一种特殊的方式使它成为通用的 用法:Java泛型:从另一个方法推断类型?,java,generics,anonymous-inner-class,Java,Generics,Anonymous Inner Class,我有一个装饰师,我想用一种特殊的方式使它成为通用的 用法: new ExceptionHandler() { public <T extends IrcEvent> void doIt( T msg, IrcBotProxy pircBotProxy ) throws Throwable { plugin.onMessage( msg, pircBotProxy );
new ExceptionHandler() {
public <T extends IrcEvent> void doIt( T msg, IrcBotProxy pircBotProxy ) throws Throwable {
plugin.onMessage( msg, pircBotProxy );
}
}.handle( msg, this.pircBotProxy );
您必须在类
ExceptionHandler
级别定义T
:
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 evt,IrcBotProxy,pircBotProxy){}
公共抽象void doIt(T事件,IrcBotProxy-pircBotProxy)抛出Throwable;
}
这是唯一一种表示“
handle()
中使用的T
与doIt()
中使用的T
相同的方法”以您的方式推断类型没有问题。下面是一个非常简单的示例,演示:
public abstract class ExceptionHandler
{
public <T extends List> void handle(T l) {
this.doIt(l);
}
public abstract <T extends List> void doIt(T l);
}
公共抽象类异常处理程序
{
公共无效句柄(TL){
这是doIt(l);
}
公开摘要无效doIt(tl);
}
公共类演示
{
公共静态void main(字符串[]args)
{
新的异常处理程序(){
@凌驾
公共无效doIt(TL)
{
System.out.println(l.size());
}
}.handle(新的ArrayList(Arrays.asList(新字符串[]{“hi”}));
}
}
输出:
一,
您声明收到一个编译错误“ExceptionHandler未实现doIt(…)”-您需要重新检查代码,确保传递了正确的参数,确保保存了文件,然后清理并重建项目 定义“不起作用”?我不明白为什么会这样(我刚刚编写了一个例子,使用
进行测试,效果很好)。您的匿名类中似乎有一个未定义的插件
变量…我建议您重新检查/保存您的文件,并进行清理/构建。这表明您的签名与此处发布的签名不匹配。他的代码应该可以正常工作,因为:泛型-推断他这样做是完全合法的。我怀疑,真正的问题与他代码中未定义的插件变量有关一个非类。不是真的,我不想把代码弄得乱七八糟,但是有一个` for(最终IIrcPluginHook plugin:this.plugins){`围绕着它。
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" } )));
}
}