我有一个servlet,传递给查询参数,从DAO获取对象列表,将列表转换为JSON,然后将其发送回响应中。每个列表都由具有方法的对象组成:
public String getAsJson(){...}
servlet有一堆看似简单的方法:
private String getUserListAsJson() {
List<User> userList = this.dao.getUsers();
StringBuilder builder = new StringBuilder();
builder.append('[');
// loops over the list appending the value of each objects getAsJson()
builder.append(']');
return builder.toString();
}
问题是我有大约6种方法(并且还在增长),除了不同的DAO查询外,它们看起来完全一样。我的想法是创建一个只有getAsJson()方法定义的接口,让每个bean实现它,然后在servlet中有另一个方法来接受实现该接口的对象。看起来像这样:
public Interface JsonEnabled {
public String getAsJson();
}
public class User implements JsonEnabled {
....
@Override
public String getAsJson() {...}
}
public class TheServlet {
...
private String getUserListAsJson() {
List<User> userList = this.dao.getUsers();
return this.getListAsJson(userList);
}
private String getListAsJson(List<? implements JsonEnabled> list) {
// The loop code that is in each method.
}
}
因此,如果有人实际读取了这个远= P,那么无法编译,在查找Oracle的一些文档后,您只能扩展而不是实现用于通用参数。从具有getAsJson()方法的抽象类扩展所有类在语义上没有意义(类是不相关的)。
我没有找到一个很好的解决方案,只是谷歌搜索,所以任何帮助/见解将不胜感激。
答案 0 :(得分:40)
对于通用通配符,关键字extends
适用于类和接口:
private String getListAsJson(List<? extends JsonEnabled> list) { ... }
当用于定义泛型边界时, extends
的含义略有不同 - 它实质上转换为“是,或扩展或实现”。
答案 1 :(得分:3)
为什么不使用
private String getListAsJson(List<JsonEnabled> list) { ... }