Wie kann eine List <Objekte, die eine Schnittstelle implementieren> an eine Methode übergeben werden?

Ich habe ein Servlet, das Abfrageparameter weitergibt, eine Liste von Objekten vom DAO abruft, die Liste in JSON umwandelt und sie in der Antwort zurücksendet. Jede Liste besteht aus Objekten, die eine Methode haben:

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

Und das Servlet verfügt über eine Reihe von meist indentischen Methoden, die wie folgt aussehen:

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

Das Problem ist, dass ich ungefähr 6 Methoden (und wachsende) habe, die bis auf verschiedene DAO-Abfragen genau so aussehen. Meine Idee war, eine Schnittstelle zu erstellen, die nur die Definition für die Methode getAsJson () enthielt, jede Bean dazu zu bringen, diese zu implementieren, und dann eine andere Methode im Servlet zu haben, die Objekte übernahm, die diese Schnittstelle implementierten. Am Ende sah es so aus:

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

Wenn also jemand bisher tatsächlich = P gelesen hat, wird das nicht kompiliert, und nachdem Sie eine Dokumentation von Oracle nachgeschlagen haben, können Sie nur habenerweitert und nichtimplementiert für generische Parameter. Das Erweitern aller Klassen von einer abstrakten Klasse mit der Methode getAsJson () ist semantisch nicht sinnvoll (die Klassen haben keine Beziehung zueinander).

Ich habe keine gute Lösung für SO gefunden oder nur gegoogelt, daher wäre jede Hilfe / Einsicht dankbar.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage