Передача Java Generi c лямбда-параметра в метод локального вызова - PullRequest
1 голос
/ 28 января 2020

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

package Desktop;

import java.util.function.*;

public class MyClass {

    public static <T, U> U myMethod(Function<T, U> myParam) {
        return otherMethod(myParam);
    }

    public static Long otherMethod(Function<String, Long> otherParam) {
        return otherParam.accept("900");
    }

    public static void main(String[] args) {
        System.out.println(myMethod(Long::valueOf));
    }
}

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

public static <T, G> List<G> fromArrayToList(T[] a, Function<T, G> mapperFunction) {
    return Arrays.stream(a).map(mapperFunction).collect(Collectors.toList());
}

/*
    Signature for map() is like this:
    <R> Stream<R> map(Function<? super T, ? extends R> mapper)
*/

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

Ответы [ 2 ]

1 голос
/ 28 января 2020

Проблема с вашим кодом в этой строке public static Long otherMethod(Function<String, Long> otherParam)

Вы вызываете не универсальный c метод form generi c метод, из-за этого в конечном итоге вы должны привести ваш параметр, который не является хорошим что нужно избегать исключений при запуске вашего кода

попробуйте код ниже

public static <T extends String, U extends Long> U myMethod(Function<T, U> myParam, T value) {
        return otherMethod(myParam, value);
    }

    public static <T, U> U otherMethod(Function<T, U> otherParam,T value) {
        return otherParam.apply(value);
    }

    public static void main(String[] args) {
        System.out.println(myMethod(Long::valueOf, "900"));
    }
1 голос
/ 28 января 2020

Одна проблема состоит в том, что есть две подписи valueOf. Один занимает примитивную длину, другой - строку.

У Java нет возможности узнать, что вы имеете в виду.

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

System.out.println(MyClass.<String, Long>myMethod(Long::valueOf));

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

Function<String, Long> func = FakeLong::valueOf;
System.out.println(MyClass.myMethod(func));

Другая проблема здесь:

return otherMethod(myParam);

Фактически, otherMethod специально требует функции, которая принимает String и возвращает long, в то время как myParam может быть любой функцией вообще. Здесь есть фундаментальная несовместимость. Ваш дизайн не так.

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