1

クラスA、BがB extends A あり、インターフェイスが次のように定義されています

public interface MyProcessor<EVENT> {
     void processEvent(EVENT event);
}

私は2つの実装を持っています

public class EventAProcessor implements EventProcessor<A> {
    @Override
    public void processEvent(A a) {
}
public class EventBProcessor implements EventProcessor<B> {
    @Override
    public void processEvent(B b) {
}

共通の処理があるので、Aprocessor から BProcessor を拡張することにしました

public class EventBProcessor extends EventAProcessor implements EventProcessor<B> {

    }

これは、メッセージで失敗する場所です

 MyProcessor cannot be inherited with different arguments: <A> and <B>

私の問題を回避するための他の解決策がありますが、どうすればこれを機能させることができるのでしょうか。

4

5 に答える 5

4

それは関係ではないのでEventBProcessor延長しないでください。必要な関数を共通の抽象クラスにプルするか、構成によって再利用する別のヘルパー クラスで再利用します。継承による再利用が常に最適なオプションとは限りません。EventAProcessoris-a

于 2012-05-29T09:56:42.640 に答える
2

抽象ジェネリック クラスを導入する必要があります。

public abstract class AbstractEventProcessor<EVENT> 
  implements EventProcessor<EVENT> {

  // Put your common logic here
}

他のクラスは、次のように共通の機能を継承します。

public class EventAProcessor extends AbstractEventProcessor<A> {}
public class EventBProcessor extends AbstractEventProcessor<B> {}

これは必ずしもジェネリックと関係があるわけではありません。これは、オブジェクト指向プログラミングでポリモーフィズムにアプローチする一般的な方法です。

于 2012-05-29T09:54:56.217 に答える
2

継承によってコードを再利用したい場合は、次のようにすればOKです:

public abstract AbstractEventAProcessor<T extends A> implements EventProcessor<T> {
    // common methods
}

public class EventAProcessor extends AbstractEventAProcessor<A> {
    @Override
    public void processEvent(A a) { ... }
}

public class EventBProcessor extends AbstractEventAProcessor<B> {
    @Override
    public void processEvent(B b) { ... }
}
于 2012-05-29T09:58:30.180 に答える
0

インターフェイスが実装のいずれかとどのように関係しているのかわかりません。どちらもMyProcessorインターフェースを実装していません。

また、Event クラスの階層も示していません。この配置でさまざまな種類のイベントを作成できると考える理由は何ですか?

これが私がそれを行う方法です:

public interface Event {
    String getName();
}

public interface EventProcessor<T extends Event> {
    void process(T event);
}

このように異なる実装は必要ありません。EventProcessorジェネリックは異なるEventタイプを区別できる必要があります。process()メソッドをタイプごとに変更する必要がある場合にのみ、カスタム実装が必要になります。もしそうなら、訪問者パターンについて考える方法があるかもしれません。

于 2012-05-29T09:58:39.847 に答える
0

A またはそのサブクラスを必要とする共有の「共通」ジェネリック 祖先を追加します。

public abstract class ACommonProcessor<AEvent extends A> implements MyProcessor<AEvent> {
    ...
    // shared code goes here
}

public class EventBProcessor extends ACommonProcessor<B> {
    ...
    // B-specific code goes here
}

public class EventAProcessor extends ACommonProcessor<A> {
    ...
    // etc
}
于 2012-05-29T09:59:44.313 に答える