4

我有一个如下界面,

public interface MethodExecutor {
    <T> List<T> execute(List<?> facts, Class<T> type) throws Exception;
}

另外,我有一个如下的通用实现,

public class DefaultMetodExecutor implements MethodExecutor {

   public <T> List<T> execute(List<?> facts, Class<T> type) throws Exception
   {
     List<T> result = null;

      //some implementation

      return result;
  }
}

到目前为止,没有编译问题,

但该接口的具体实现编译失败,如下图所示。

public class SpecificMetodExecutor implements MethodExecutor {

   public <Model1> List<Model1> execute(List<Model2> facts, Class<Model1> type) throws Exception
   {
     List<Model1> result = null;

     //some implementation specific to Model1 and Model2

      return result;
  } 
}

如何为某些已定义的对象实现此接口?我需要去学习类级别的泛型吗?

4

2 回答 2

9

您需要制作T一个类类型参数,而不是方法类型参数。您不能用非泛型方法覆盖泛型方法。

public interface MethodExecutor<T> {
    List<T> execute(List<?> facts, Class<T> type) throws Exception;
}

public class DefaultMethodExecutor implements MethodExecutor<Model1> {
    public List<Model1> execute(List<?> facts, Class<Model1> type) throws Exception
    {
       //...
    }
} 

如果元素类型facts应该可配置用于特定实现,则您也需要将其设为参数。

public interface MethodExecutor<T, F> {
    List<T> execute(List<? extends F> facts, Class<T> type) throws Exception;
}
于 2013-05-15T15:06:16.670 回答
4

您需要将泛型参数类型从方法声明移动到接口声明,以便对特定实现进行参数化:

public interface MethodExecutor<T> {
    List<T> execute(List<?> facts, Class<T> type) throws Exception;
}

public class SpecificMetodExecutor implements MethodExecutor<Model1> {
    public List<Model1> execute(List<Model2> facts, Class<Model1> type) throws Exception {
        ...
    }
}
于 2013-05-15T15:08:15.683 回答