19

我有一个 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 查找一些文档后,您只能扩展而不是实现泛型参数。从仅具有 getAsJson() 方法的抽象类中扩展所有类在语义上没有意义(这些类是不相关的)。

我还没有找到一个好的解决方案,或者只是在谷歌上搜索,所以任何帮助/见解都将不胜感激。

4

2 回答 2

45

对于通用通配符,关键字extends适用于类和接口:

private String getListAsJson(List<? extends JsonEnabled> list) { ... }

extends当用于定义通用边界时,其含义略有不同——它本质上翻译为“是,或扩展,或实现”。

于 2012-04-10T13:56:37.857 回答
3

为什么不直接使用

private String getListAsJson(List<JsonEnabled> list) { ... }

?

于 2012-04-10T14:02:49.100 回答