我有几个接口来支持我们对实体的后处理:
工作流处理器
public interface WorkFlowProcessor {
void PostProcess(List<WorkFlowStrategy> strategies);
}
工作流操作
public class WorkFlowAction implements WorkFlowProcessor{
...
...
public void PostProcess(List<WorkFlowStrategy> strategies){
for(WorkFlowStrategy strategy : strategies){
strategy.process(this)
}
}
}
工作流程策略
public interface WorkFlowStrategy {
void process(WorkFlowProcessor itemToProcess);
}
工单工作流程策略
public class TicketWorkFlowStrategy implements WorkFlowStrategy {
...
...
@Overried
public void process(WorkFlowAction action){ //must override or implement a supertype method
// do a lot of processing
}
}
我试图弄清楚为什么我不能用 WorkFlowAction
类编译它。 通常这工作得很好。 关于如何使其正确运行的任何想法?
这是因为您必须使用与接口中的方法相同的签名来声明它:
<T extends WorkFlowProcessor> void process(T itemToProcess)
在接口中声明这样的方法并不意味着您可以将其实现专门用于更具体的参数。此方法必须接受任何WorkflowProcessor
。
正因为如此,这里的类型变量是毫无用处的:你也可以在接口中这样声明它,这使得实现起来也更干净:
void process(WorkflowProcessor itemToProcess);
方法级类型变量实际上没有用处,除非您执行以下一项或多项操作:
- 返回与非泛型参数相同的类型
- 将泛型参数约束为与另一个参数或返回类型相关。
如果你想将process
方法专门化于WorkflowProcessor
的特定子类,你必须把它放在interface
:
public interface WorkFlowStrategy<T extends WorkFlowProcessor> {
void process(T itemToProcess);
}
然后:
public class TicketWorkFlowStrategy implements WorkFlowStrategy<WorkflowAction> {
@Override
public void process(WorkFlowAction action){
// ...
}
}
WorkFlowStrategy
接口中定义的 process
方法的含义是,实现应该能够接受任何WorkFlowProcessor
作为该方法的参数。 添加到此方法的泛型定义不会更改此设置。
在您的情况下,泛型定义可能属于接口级别,而不是方法级别。 然后,可以明确说明可以支持哪些类型。