Я должен реализовать функцию, которая имеет одинаковую функциональность, но другой тип возврата, и параметр функции также одинаков.
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
, потому что функциональность одинакова, поэтому возникнет избыточность, если я реализую один и тот же метод дважды только из-за разных типов данных.
Возможный дубликат Как заставить метод Java возвращать общий список любого типа?
Это невозможно сделать, если они имеют одинаковое имя. Как компилятор сможет узнать, какой из них выполнять, когда вы вызываете remove(List)? Тот, который возвращает List<Base> или List<Subclass>?
Java не поддерживает перегрузку методов на основе возвращаемого типа. Переименуйте метод и вызовите один из другого, если хотите избежать избыточности. связь
Вы можете создать общий вызов метода remove(List<T> аранжировать) и вызывать его из обоих классов.
Просто оставьте List<Subclass> remove(List<Subclass>)
и бросьте другой. Нет причин для сохранения второго метода.
Если у вас есть метод, который имеет одинаковую логику с разными типами параметров, вы можете создать универсальную версию такого метода. В вашем случае такой метод будет выглядеть так:
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)
Если типы возвращаемых значений ограничены, вы можете установить связь между базовым и подклассом. И используйте ковариации для работы с несколькими типами возвращаемых значений.
Вы можете использовать один метод с дженериками, если единственная разница заключается в типе возвращаемого значения.