Java 流水线架构中的泛型

Java generics in pipeline architecture

我有一个基础摘要 class PipelineStage 具有以下定义:

public abstract class PipelineStage<I, O> implements Runnable {

    ...

    public abstract O step(I input);

    ...

}

然后我有许多具体的管道阶段,其定义如下:

public class ConcreteStage extends PipelineStage<InputContextClass, OutputContextClass> {

    ...

    @Override
    public OutputContextClass step(InputContextClass input) {
        input.someMethod();
        ...
        return new OutputContextClass();
    }

    ...

}

然而,这导致了一种僵硬的设计,其中:

  1. 上下文 classes 与它们所用的阶段紧密相关。

  2. 每个阶段都需要定义两个完整的接口,定义输入和输出的所有属性classes.

我想通过具有指定上下文 classes 属性的通用接口来改进此设计,然后 ConcreteStage 将指定它的输入和输出上下文 classes 必须扩展的接口。

但是,我不知道如何以编译器喜欢的方式执行此操作。

例如:

public class ConcreteStage extends PipelineStage<I extends Interface1 & Interface2, 
    O extends Interface2 & Interface3> {

    ...

    @Override
    public O step(I input) {
        input.someMethodFromInterface1();
        input.someMethodFromInterface2();
        ...
        // OutputContextClass extends Interface2 & Interface3
        return new OutputContextClass();
    }

    ...

}

然而,这并没有编译,显示 class I 需要导入。

通配符也不行,表示No wildcard expected.

有没有人对如何以简洁、灵活的方式实现它有任何建议?非常感谢!

您需要将类型变量声明放在 class 上,而不是 superclass:

public static class ConcreteStage<
          I extends Interface1 & Interface2, O extends Interface2 & Interface3>
      extends PipelineStage<I, O> {

您还可以制作一个将输入界面组合在一起的界面 interface InputInterface12 extends InputInterface1, InputInterface2 {} 然后 class ConcreteStage extends PipelineStage<InputInterface12, OutputInterface12> {...}