如何将List <实现接口的对象>传递给方法?

Win*_*dle 17 java generics inheritance abstraction

我有一个servlet,传递给查询参数,从DAO获取对象列表,将列表转换为JSON,并将其发送回响应中.每个列表都由具有方法的对象组成:

public String getAsJson(){...}
Run Code Online (Sandbox Code Playgroud)

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();
}
Run Code Online (Sandbox Code Playgroud)

问题是我有大约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.
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,如果有人实际读取了这个远= P,那么无法编译,并且在从Oracle查找一些文档之后,您只能扩展而不是泛型参数的实现.使所有类从具有getAsJson()方法的抽象类扩展在语义上没有意义(类是不相关的).

我还没有找到一个很好的解决方案,或只是谷歌搜索,所以任何帮助/洞察力将不胜感激.

Pau*_*ora 43

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

private String getListAsJson(List<? extends JsonEnabled> list) { ... }
Run Code Online (Sandbox Code Playgroud)

extends 当用于定义泛型边界时,它具有略微不同的含义 - 它实质上转换为"是,或扩展或实现".