1

我有 A、B 类,B extends A 接口定义为

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

我有两个实现

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扩展EventAProcessor,因为这不是is-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

如果你想通过继承重用代码,以下应该是可以的:

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 回答