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.