Как можно передать List<объекты, реализующие интерфейс> методу?

. У меня есть сервлет, который при передаче параметров запроса получает список объектов из DAO, преобразует список в JSON и отправляет обратно в ответ. Каждый список состоит из объектов, у которых есть метод:

public String getAsJson(){...}

И у сервлета есть куча в основном одинаковых методов, которые выглядят как:

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

Проблема в том, что у меня есть около 6 методов (и растущие), которые выглядят точно так же, как это, за исключением различных запросов DAO. Моя идея заключалась в том, чтобы создать интерфейс, в котором было бы определение только для метода getAsJson(), сделать так, чтобы каждый bean-компонент реализовал его, а затем иметь в сервлете еще один метод, который принимал бы объекты, реализующие этот интерфейс. В итоге получилось вот так:

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

Итак, если кто-то действительно дочитал до этого места =P, который не компилируется, и после поиска документации от Oracle вы можете иметь только расширения , а не реализации для общих параметров. Расширение всех классов от абстрактного класса, который имеет только метод getAsJson(), не имеет смысла семантически (, классы не связаны).

Я не нашел хорошего решения на SO или просто погуглил, поэтому буду признателен за любую помощь/понимание.

17
задан Paul Bellora 10 April 2012 в 14:15
поделиться