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

1

У меня есть методы:

public List<Integer> convertBy(Function<String, List<String>> flines, Function<List<String>, String> join, Function<String, List<Integer>> collectInts) {
    return collectInts.apply(join.apply(flines.apply((String) value)));
}//first method

public Integer convertBy(Function<List<String>, String> join, Function<String, List<Integer>> collectInts, Function<List<Integer>, Integer> sum) {
    return sum.apply(collectInts.apply(join.apply((List<String>) value)));
}//second method

Несмотря на то, что их параметры параметризованы разными типами, я не могу перегрузить первый метод. Я мог бы использовать другой интерфейс, кроме Function<T,R>, но не знаю, какого из них хватит, поскольку я просмотрел их список и не смог найти его https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html.

Параметры в этих функциях:

flines - читает файл с заданного пути (String) и возвращает список строк в этом файле (List<String>)

join - объединяет элемент заданного List<String> и возвращает a String

collectInts - анализирует данный String и возвращает список целых чисел, найденных в этом String.

sum - добавляет элементы из List<Integers> и возвращает сумму

Вопросы:

  • Можно ли перегрузить первый меход вторым?

  • Какой еще существующий функциональный интерфейс я могу использовать помимо функции? Я думаю, что нет, поскольку типы аргументов и результата всегда отличаются.

  • 1
    Из-за вывода типа это невозможно, так как во время компиляции типы списков (или любая конструкция, которая использует обобщенные значения) будут удалены, и у вас останутся две идентичные сигнатуры функций. - редактировать: подождите, я правильно понял ваш вопрос?
  • 0
    Все еще расшифровываю название темы. Пожалуйста, возобновите это. В любом случае ответ в пункте 1. - нет.
Показать ещё 2 комментария
Теги:
generics
functional-interface

1 ответ

3

Если вы хотите создать метод, который применяет несколько функций и не интересуется промежуточными значениями, вы можете сделать его общим методом. Код в вашем вопросе странный, поскольку он предполагает, что value может быть String и a List<String> в то же время.

Но по сравнению с вашим другим вопросом, у вас другая картина. Хотя метод varargs не работает таким образом, вы можете легко обеспечить перегруженные методы для фактических случаев использования:

public class InputConverter<T> {

    private T value;

    public InputConverter(T value) {
        this.value = value;
    }
    public <R> R convertBy(Function<? super T, ? extends R> f) {
        return f.apply(value);
    }
    public <T1,R> R convertBy(
        Function<? super T, ? extends T1> f1, Function<? super T1, ? extends R> f2) {
        return f2.apply(f1.apply(value));
    }
    public <T1,T2,R> R convertBy(
        Function<? super T, ? extends T1> f1, Function<? super T1, ? extends T2> f2,
        Function<? super T2, ? extends R> f3) {
        return f3.apply(f2.apply(f1.apply(value)));
    }
    public <T1,T2,T3,R> R convertBy(
        Function<? super T, ? extends T1> f1, Function<? super T1, ? extends T2> f2,
        Function<? super T2, ? extends T3> f3, Function<? super T3, ? extends R> f4) {
        return f4.apply(f3.apply(f2.apply(f1.apply(value))));
    }
}

Предполагая, что вы исправили свои типы интерфейса и создали функции, описанные в этом ответе, вы можете использовать его как

InputConverter<String> fileConv=new InputConverter<>("LamComFile.txt");
List<String> lines = fileConv.convertBy(flines);
String text = fileConv.convertBy(flines, join);
List<Integer> ints = fileConv.convertBy(flines, join, collectInts);
Integer sumints = fileConv.convertBy(flines, join, collectInts, sum);
  • 0
    Он по-прежнему допускает только произвольное количество аргументов (до 4). Как вы думаете, было бы возможно принять более 4 аргументов (то есть любое количество Function<A,R> и при этом иметь некоторую безопасность типов (например, предупреждения компилятора или ClassCastException во время выполнения?
  • 1
    @ REACHUS: конечно. Вы можете объявить метод varargs, используя необработанные типы, т.е. Function... arg . Затем вы получаете предупреждения компилятора, когда типизированные функции назначаются параметру необработанного типа. Но это именно то, о чем другой вопрос . См. Объявление в самом начале вопроса ... Решение kocko сработает, как только будут решены проблемы с описанием типов, описанные в моем ответе.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню