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

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

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, потому что функциональность одинакова, поэтому возникнет избыточность, если я реализую один и тот же метод дважды только из-за разных типов данных.


person ROHIT PATHAK    schedule 21.05.2019    source источник
comment
Вы можете использовать один метод с дженериками, если единственная разница заключается в типе возвращаемого значения.   -  person second    schedule 21.05.2019
comment
Возможный дубликат Как заставить метод Java возвращать универсальный список любого типа?   -  person Frakcool    schedule 21.05.2019
comment
Это невозможно сделать, если они имеют одинаковое имя. Как компилятор сможет узнать, какой из них выполнять, когда вы вызываете remove(List)? Тот, который возвращает List‹Base› или List‹Subclass›?   -  person burm87    schedule 21.05.2019
comment
Java не поддерживает перегрузку методов на основе возвращаемого типа. Переименуйте метод и вызовите один из другого, если хотите избежать избыточности. ссылка   -  person Sumit Bhardwaj    schedule 21.05.2019
comment
Вы можете создать общий вызов метода remove(List‹T› Arrange) и вызывать его из обоих классов.   -  person dassum    schedule 21.05.2019
comment
Просто оставьте List<Subclass> remove(List<Subclass>) и бросьте другой. Нет причин для сохранения второго метода.   -  person Holger    schedule 21.05.2019


Ответы (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);

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

person Marco R.    schedule 21.05.2019

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

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

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

person chakwok    schedule 21.05.2019

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

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

person Jayant Kumar    schedule 21.05.2019