Como você pode passar um List <objetos que implementam uma interface> para um método?

Eu tenho um servlet que, transmitido em params de consulta, obtém uma lista de objetos do DAO, transforma a lista em JSON e a envia de volta na resposta. Cada lista é feita de objetos que possuem um método:

<code>public String getAsJson(){...}
</code>

E o servlet tem um monte de métodos principalmente indentical que se parecem com:

<code>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();
}
</code>

O problema é que eu tenho cerca de 6 métodos (e crescimento) que parecem exatamente com isso, exceto para diferentes consultas do DAO. Minha ideia era criar uma interface que tivesse apenas a definição do método getAsJson (), fazer com que cada bean implementasse isso e, em seguida, ter outro método no servlet que levasse objetos que implementassem essa interface. Acabou parecendo assim:

<code>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.
    }
}
</code>

Então, se alguém realmente leu até aqui = P, isso não compila e depois de procurar alguma documentação da Oracle, você só pode terestende e nãoimplementa para parâmetros genéricos. Fazer com que todas as classes se estendam a partir de uma classe abstrata que apenas tenha o método getAsJson () não faz sentido semanticamente (as classes não são relacionadas).

Eu não encontrei uma boa solução em SO ou apenas pesquisando, então qualquer ajuda / insight seria apreciada.

questionAnswers(2)

yourAnswerToTheQuestion