通用继承问题

时间:2017-04-05 20:39:02

标签: java generics inheritance

我有几个接口支持我们对实体的后期处理:

WorkFlowProcessor

public interface WorkFlowProcessor {
   void PostProcess(List<WorkFlowStrategy> strategies);
}

WorkFlowAction

public class WorkFlowAction implements WorkFlowProcessor{
   ...
   ...
    public void PostProcess(List<WorkFlowStrategy> strategies){
      for(WorkFlowStrategy strategy : strategies){
           strategy.process(this)
      }
    }
}

WorkFlowStrategy

public interface WorkFlowStrategy {
   void process(WorkFlowProcessor itemToProcess);
}

TicketWorkFlowStrategy

public class TicketWorkFlowStrategy implements WorkFlowStrategy {
   ...
   ...
   @Overried
   public void process(WorkFlowAction action){   //must override or implement a supertype method
       // do a lot of processing
   }
}

我正在试图找出为什么我无法使用WorkFlowAction类进行编译。通常情况下这很好。关于如何让它正确运行的任何想法?

2 个答案:

答案 0 :(得分:0)

那是因为你必须使用与界面中的方法相同的签名来声明它:

<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){
    // ...
  }
}

答案 1 :(得分:-1)

process接口中定义的WorkFlowStrategy方法的含义是,实现应该能够接受任何WorkFlowProcessor作为方法的参数。您添加到此方法的通用定义不会对此进行任何更改。

在您的情况下,通用定义可能属于接口级别,而不是方法级别。然后,您可以明确说明可以支持哪些类型。