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