具有通用 Return 类型的命令模式
Command Pattern with Generic Return Type
我正在尝试使用 Java 中的通用 return 类型实现 Command Pattern
。
在 reviewing this answer on SO 之后,我创建了一个 Command
class(界面),如下所示:
public interface Command <T> {
T execute(ArrayList<String> list, T type);
}
public class SearchResultsPage implements Command{
@Override
public <T extends List<ProductPOJO>> T execute(ArrayList<String> list, T type) {
List<ProductPOJO> productPOJOList = generatePOJOFromSearch(list);
type.addAll(productPOJOList);
return type;
}
}
然而,Eclipse 一直抱怨:
The method execute(ArrayList, T) of type SearchResultsPage
must override or implement a supertype method
但是当我点击
Create execute() in supertype Command
Eclipse 自动在 Command
class 中生成方法 T execute(ArrayList<String> list, T type);
(即,与我创建的完全相同的签名)但错误消息并没有消失。
我该如何解决这个问题?
谢谢!
您对 execute
方法的实施不正确。您已经使用 T
类型参数使接口通用,但是在具体 class SearchResultsPage
中实现它时没有提供类型参数。这意味着您已经实现了接口的原始形式。相反,当方法在接口中不是通用的时,您已经使方法本身成为通用的。
将 class 方法中 T
的声明移动到 class 本身。
public class SearchResultsPage<T extends List<ProductPOJO>> implements Command<T> {
@Override
public T execute(ArrayList<String> list, T type) {
// ...
}
}
我正在尝试使用 Java 中的通用 return 类型实现 Command Pattern
。
在 reviewing this answer on SO 之后,我创建了一个 Command
class(界面),如下所示:
public interface Command <T> {
T execute(ArrayList<String> list, T type);
}
public class SearchResultsPage implements Command{
@Override
public <T extends List<ProductPOJO>> T execute(ArrayList<String> list, T type) {
List<ProductPOJO> productPOJOList = generatePOJOFromSearch(list);
type.addAll(productPOJOList);
return type;
}
}
然而,Eclipse 一直抱怨:
The method execute(ArrayList, T) of type SearchResultsPage must override or implement a supertype method
但是当我点击
Create execute() in supertype Command
Eclipse 自动在 Command
class 中生成方法 T execute(ArrayList<String> list, T type);
(即,与我创建的完全相同的签名)但错误消息并没有消失。
我该如何解决这个问题?
谢谢!
您对 execute
方法的实施不正确。您已经使用 T
类型参数使接口通用,但是在具体 class SearchResultsPage
中实现它时没有提供类型参数。这意味着您已经实现了接口的原始形式。相反,当方法在接口中不是通用的时,您已经使方法本身成为通用的。
将 class 方法中 T
的声明移动到 class 本身。
public class SearchResultsPage<T extends List<ProductPOJO>> implements Command<T> {
@Override
public T execute(ArrayList<String> list, T type) {
// ...
}
}