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:
public String getAsJson(){...}
E o servlet tem um monte de métodos principalmente indentical que se parecem com:
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();
}
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:
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.
}
}
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.