sobreescribir recorrer metodo las interfaz interfaces example ejemplo como caracteristicas java generics inheritance abstraction

java - recorrer - ¿Cómo se puede pasar una lista<objetos que implementan una interfaz> a un método?



iterator java ejemplo (2)

Tengo un servlet que, pasado los parámetros de consulta, obtiene una lista de objetos del DAO, convierte la lista en JSON y la devuelve en la respuesta. Cada lista está hecha de objetos que tienen un método:

public String getAsJson(){...}

Y el servlet tiene un montón de métodos en su mayoría idénticos que parecen:

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

El problema es que tengo alrededor de 6 métodos (y en crecimiento) que se ven exactamente así excepto por diferentes consultas DAO. Mi idea fue crear una interfaz que solo tuviera la definición para el método getAsJson (), hacer que cada bean lo implemente y luego tener otro método en el servlet que tomó objetos que implementaron esa interfaz. Acabé luciendo así:

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

Entonces, si alguien ha leído hasta aquí tan lejos = P, eso no se compila y después de buscar algo de documentación de Oracle, solo puede tener extensiones y no implementos para parámetros genéricos. Hacer que todas las clases se extiendan desde una clase abstracta que solo tiene el método getAsJson () no tiene sentido semánticamente (las clases no están relacionadas).

No he encontrado una buena solución para SO o simplemente buscar en Google, por lo que cualquier ayuda / conocimiento sería apreciado.


¿Por qué no solo usar

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

?


Para caracteres comodín genéricos, la palabra clave extends trabajos para ambas clases e interfaces:

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

extends tiene un significado ligeramente diferente cuando se usa para definir límites genéricos; esencialmente se traduce como "es, se extiende o implementa".