Java: программирование с интерфейсом, но необходимость создания конкретного класса - PullRequest
0 голосов
/ 22 февраля 2012

Я делаю свои первые шаги с обобщениями, и я только что закодировал обобщенную функцию для сравнения двух объектов List, как это

public static <T> List<T> diffAdded(List<T> source, List<T> dest) {
    List<T> ret = new ArrayList<T>();
    for(T element: dest) {
        if (!source.contains(element)) {
            ret.add(element);
        }
    }
    return ret;
}

Все работает нормально, но я создаю экземпляр ArrayList, потому что, очевидно, я не могу создать экземпляр списка List

Дело в том, что я хочу вернуть объект того же типа, что и источник ...

как вы справляетесь с такими ситуациями?

Могу ли я столкнуться с какими-либо проблемами при использовании метода, как сейчас?

большое спасибо

Ответы [ 2 ]

4 голосов
/ 22 февраля 2012

Ответ на этот вопрос почти всегда , что «возвращение объекта того же типа, что и источник» на самом деле не имеет отношения к вашему приложению, и что вы поступаете неправильно.

Если вашему абоненту нужна конкретная реализация List, потому что он будет выполнять на нем определенные операции, тогда он может выполнить копирование самостоятельно ... но если ваш метод принимает произвольный аргумент типа List и вывод изменяется семантически в зависимости от точной реализации ввода, тогда это огромный запах кода.

Оставьте ваш код таким, какой он есть, и если вызывающие ваши методы действительно нуждаются в конкретной реализации, то они могут сами скопировать ваш вывод в эту реализацию.

1 голос
/ 22 февраля 2012

У вас есть два варианта здесь.

1: Поймите, что точка принятия интерфейса List<T> в качестве входного типа означает, что вы явно говорите, что вам нет дела до базовой реализации. Кроме того, возвращая List<T>, он говорит, что ваш вызывающий не должен заботиться о базовой реализации. В большинстве случаев List - это List, и детали не должны иметь значения. Если это так, вы должны явно вернуть ArrayList<T>.

2: Выполните несколько полиморфных вызовов, соответствующих каждому List типу реализации, который вы хотите поддерживать.

Я очень думаю, что первый ответ - это то, куда вы должны направить свои усилия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...