纠结于仿制药

时间:2012-05-29 09:52:11

标签: java generics inheritance

我的课程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>

我有其他解决方案来解决我的问题,但只是想知道如何让这个工作。

5 个答案:

答案 0 :(得分:4)

不要EventBProcessor延长EventAProcessor,因为它不是is-a关系。通过将它们拉入公共抽象类或在组合重用的单独辅助类中重用所需的函数。它并不总是通过继承重用的最佳选择。

答案 1 :(得分: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> {}

这不一定与泛型有关。这是在面向对象编程中应用多态的一种通用方法。

答案 2 :(得分: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) { ... }
}

答案 3 :(得分:0)

我没看到界面与你的任何一个实现有什么关系。它们都没有实现MyProcessor接口。

您也不会显示Event类的任何层次结构。是什么让你认为你可以通过这种安排拥有不同的事件类型?

我可以这样做:

public interface Event {
    String getName();
}

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

您不需要以这种方式实现不同的EventProcessor实现 - 通用应该能够区分不同的Event类型。如果process()方法需要按类型更改,则只需要自定义实现。如果确实如此,你可能会考虑一个访客模式。

答案 4 :(得分: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
}