【发布时间】:2012-04-22 19:51:00
【问题描述】:
我有一个 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.
}
}
但它无法编译。从 Oracle 查找一些文档后,您只能有 extends 而不是 implements 用于泛型参数。让所有类都继承自一个只有 getAsJson() 方法的抽象类在语义上没有意义(这些类是不相关的)。
我还没有找到关于 SO 的好的解决方案,或者只是在谷歌上搜索,所以任何帮助/见解都将不胜感激。
【问题讨论】:
-
相切但你真的想自己构建 JSON 字符串吗?建议使用 Jackson 之类的库或其他库
标签: java generics inheritance abstraction