Как реализовать метод с одинаковым параметром, но с другой подписью

Я должен реализовать функцию, которая имеет одинаковую функциональность, но другой тип возврата, и параметр функции также одинаков.

public static List<Base> remove(List<Subclass> arrange ) {
    List<Base>update = new ArrayList<>();

    for(Subclass arranging : arrange){
        //For-loop body here
    }
    return update;
}

public static List<Subclass> remove(List<Subclass> arrange ) {
    List<Subclass>update = new ArrayList<>();

    for(Subclass arranging : arrange){
        //For-loop body here
    }
    return update;
}  

Здесь Base и Subclass — уже определенные классы.

Только один метод должен быть назван remove, потому что функциональность одинакова, поэтому возникнет избыточность, если я реализую один и тот же метод дважды только из-за разных типов данных.

Вы можете использовать один метод с дженериками, если единственная разница заключается в типе возвращаемого значения.

second 21.05.2019 17:21

Это невозможно сделать, если они имеют одинаковое имя. Как компилятор сможет узнать, какой из них выполнять, когда вы вызываете remove(List)? Тот, который возвращает List<Base> или List<Subclass>?

burm87 21.05.2019 17:21

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

Sumit Bhardwaj 21.05.2019 17:22

Вы можете создать общий вызов метода remove(List<T> аранжировать) и вызывать его из обоих классов.

dassum 21.05.2019 17:25

Просто оставьте List<Subclass> remove(List<Subclass>) и бросьте другой. Нет причин для сохранения второго метода.

Holger 21.05.2019 18:23
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
6
269
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

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

    public static <T> List<T> remove(List<T> arrange) {
        List<T> update = new ArrayList<>();

        for (T arranging : arrange) {
            //For-loop body here
        }
        return update;
    }

Затем вы можете использовать этот метод с любым T (Base или Subclass), и метод будет работать с элементами списка, передаваемыми в качестве аргумента, и также возвращать соответствующий тип:

        List<Subclass> one = ...;
        one = remove(one);

        List<Base> two = ...;
        two = remove(two);

Надеюсь это поможет.

То, что вам нужно здесь, называется универсальным методом.

Одно универсальное объявление метода, которое можно вызывать с аргументами разных типов. Общая функция, которая вам нужна, будет выглядеть так:

public static < E > List<E> remove( List<E> arrange ) {...}

В случае, если существует более одного универсального типа, и один из них является подклассом другого (например, BaseClass и SubClass), объявление будет выглядеть так:

public static < E, F > List<E> remove( List<F extends E> arrange ) {...}

Для получения дополнительной информации вы можете обратиться к https://www.tutorialspoint.com/java/java_generics.htm

Я вижу, вы находитесь в ситуации, когда два метода делают почти одно и то же, но по-разному представляют результат вызывающей стороне. Используйте дженерики, если домен возвращаемого типа больше. public static E remove(List<E> arrange)

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

Другие вопросы по теме