Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 一般继承问题_Java_Generics_Inheritance - Fatal编程技术网

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