Java 一般继承问题
我有几个接口来支持实体的后处理: 工作流处理器Java 一般继承问题,java,generics,inheritance,Java,Generics,Inheritance,我有几个接口来支持实体的后处理: 工作流处理器 public interface WorkFlowProcessor { void PostProcess(List<WorkFlowStrategy> strategies); } TicketWorkFlowStrategy public interface WorkFlowStrategy { void process(WorkFlowProcessor itemToProcess); } public class
public interface WorkFlowProcessor {
void PostProcess(List<WorkFlowStrategy> strategies);
}
TicketWorkFlowStrategy
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类编译它。通常情况下,这一切都很好。关于如何使其正确运行,有什么想法吗?WorkFlowStrategy接口中定义的process方法意味着实现应该能够接受任何WorkFlowProcessor作为该方法的参数。添加到此方法的泛型定义不会对此进行任何更改
在您的例子中,泛型定义可能属于接口级别,而不是方法级别。然后,您可以明确说明支持哪些类型。这是因为您必须使用与接口中的方法相同的签名来声明它:
<T extends WorkFlowProcessor> void process(T itemToProcess)
方法级别的类型变量实际上并不有用,除非您执行以下一项或多项操作:
返回与非泛型参数相同的类型
将泛型参数约束为与另一个参数或返回类型相关。
如果您想为WorkflowProcessor的特定子类专门化处理方法,则必须将其放在接口上:
<T extends WorkFlowProcessor> void process(T itemToProcess)
然后:
这是因为您必须使用与接口中的方法相同的签名来声明它:void processT itemToProcess;您也可以将其声明为void processWorkflowProcessor itemToProcess。@AndyTurner,在我发布这个问题之前,我尝试了您建议的一切。如果不创建许多接受具体实现的流程方法,它仍然无法工作。我通过传入WorkFlowAction Id Long而不是类型来解决这个问题。当我需要知道的时候,我会在数据库中查询类型。谢谢是的,这是可行的,但现在您的策略已被锁定,无法为此动态使用其他实现interface@Dan是的。这是因为:所有子类都必须接受至少和它们的超类一样通用的参数。在子类中不能更具体,Java不接受逆变参数类型,所以也不能更具体。。。我去看看
void process(WorkflowProcessor itemToProcess);
public interface WorkFlowStrategy<T extends WorkFlowProcessor> {
void process(T itemToProcess);
}
public class TicketWorkFlowStrategy implements WorkFlowStrategy<WorkflowAction> {
@Override
public void process(WorkFlowAction action){
// ...
}
}