W jaki sposób można przekazać obiektowi List <obiekty, które implementują interfejs> do metody?
Mam serwlet, który przekazał parametry zapytania, pobiera listę obiektów z DAO, zamienia listę w JSON i wysyła ją z powrotem w odpowiedzi. Każda lista składa się z obiektów, które mają metodę:
<code>public String getAsJson(){...} </code>
A serwlet ma kilka metod, które wyglądają jak:
<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>
Problem polega na tym, że mam około 6 metod (i rośnie), które wyglądają dokładnie tak samo, z wyjątkiem różnych zapytań DAO. Moim pomysłem było stworzenie interfejsu, który miałby tylko definicję metody getAsJson (), aby każdy komponent bean implementował ją, a następnie inną metodę w serwletu, która pobierała obiekty, które implementowały ten interfejs. Skończyło się tak:
<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>
Więc jeśli ktoś rzeczywiście przeczytał ten daleko = P, to nie kompiluje się i po przejrzeniu jakiejś dokumentacji z Oracle możesz mieć tylkorozciąga się i nienarzędzia dla parametrów ogólnych. Uczynienie wszystkich klas z klasy abstrakcyjnej, która ma właśnie metodę getAsJson (), nie ma sensu semantycznego (klasy są niepowiązane).
Nie znalazłem dobrego rozwiązania na SO lub po prostu googlując, więc każda pomoc / wgląd zostanie doceniona.