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();
}
...
}
然而,这导致了一种僵硬的设计,其中:
上下文 classes 与它们所用的阶段紧密相关。
每个阶段都需要定义两个完整的接口,定义输入和输出的所有属性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> {...}
。
我有一个基础摘要 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();
}
...
}
然而,这导致了一种僵硬的设计,其中:
上下文 classes 与它们所用的阶段紧密相关。
每个阶段都需要定义两个完整的接口,定义输入和输出的所有属性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> {...}
。