2011-01-27 9 views
3

実装クラスで定義されたメソッドのパラメータが特定のJavaクラスのサブタイプになるインターフェイスでメソッドを宣言したい。Javaインターフェイスのパラメータサブタイプを宣言し、Java実装メソッドのサブタイプを使用する

interface Processor{ 
     processRequest(Request r); 
} 

public class SpecialRequest extends Request{...} 

public class SpecialProcessor implements Processor{ 

     processRequest(SpecialRequest r){...} 
} 

私はプロセッサインターフェイスを正しく実装していないため、SpecialProcessorにエラーが発生します。 SpecialProcessorの定義を機能させるためにプロセッサー・インターフェースで何を変更できますか?

答えて

9

あなたはProcessorを入力することができます:そうですね

public interface Processor<R extends Request> { 
    void processRequest(R r); 
} 


public class SpecialProcessor implements Processor<SpecialRequest> { 
    public void processRequest(SpecialRequest r) { 
     ... 
    } 
} 
3

は - 呼び出し側がインタフェースの特定の実装が使用されているかを知るべきではないことに注意してください。 Request任意のリクエスト)をprocessRequestに渡すことができますが、実装では、特定のメソッド呼び出しが型正しくない原因となる引数に対してより厳しい制約が課されていることがわかります。

あなたはこれをしたい場合、あなたは、インターフェイスに次のようなものを一般的なパラメータを追加する必要があります:

interface Processor<R extends Request> { 
    void processRequest(R r); 
} 

public class SpecialProcessor implements Processor<SpecialRequest> { 

    public void processRequest(SpecialRequest r) { ... } 

} 

この方法では、「通常の」要求を渡すしたい発信者は意志変数Processor<Request>の変数/フィールドを宣言しなければならず、あなたのSpecialProcessorはこの境界にマッチしなくなり、割り当てられず、コンパイル時に正しく拒否されます。特別なリクエスト自体を処理している呼び出し側はProcessor<SpecialRequest>変数/フィールドを使用することができます。クラスはになり、に割り当てられます。

関連する問題