5

クラスの実装で定義されたメソッドのパラメーターが特定のJavaクラスのサブタイプである可能性があるインターフェースでメソッドを宣言したいと思います。例:

interface Processor{
      processRequest( Request r);
}

public class SpecialRequest extends Request{...}

public class SpecialProcessor implements Processor{

      processRequest(SpecialRequest r){...}
}

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

4

2 に答える 2

9

次のように入力できますProcessor

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


public class SpecialProcessor implements Processor<SpecialRequest> {
    public void processRequest(SpecialRequest r) {
       ...
    }
}
于 2011-01-27T18:16:36.517 に答える
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>変数/フィールドを使用できます。

于 2011-01-27T18:17:46.387 に答える