【发布时间】:2016-11-29 21:35:49
【问题描述】:
我有一个基本抽象类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();
}
...
}
但是,这导致了一种僵化的设计,其中:
上下文类与使用它们的阶段紧密耦合。
每个阶段都需要定义两个完整的接口,定义输入和输出类的所有属性。
我想通过使用指定上下文类属性的通用接口来改进此设计,然后 ConcreteStage 将指定它的输入和输出上下文类必须扩展的接口。
但是,我不知道如何以编译器喜欢的方式执行此操作。
例如:
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();
}
...
}
但是,这不会编译,表明需要导入类 I。
通配符也不起作用,例如No wildcard expected。
有没有人对如何以一种简洁、灵活的方式实现这一点有任何建议?非常感谢!
【问题讨论】:
-
只是猜测,
I和O现在不应该成为ConcreteStage的泛型参数,比如ConcreteStage<I, O> -
@DanilGaponov 你的想法和安迪·特纳的回答一样,我回答了他为什么我认为这不是一个完全合适的解决方案。
标签: java generics interface architecture