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で使用されているものは、で使用されているhandle()ものと同じ」と言う唯一の方法です。TdoIt()

于 2013-07-14T07:04:00.323 に答える