Уровень метода Общая типизация для flatMap - PullRequest
0 голосов
/ 05 ноября 2019

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

public <R> SpecialList<R> flatMap(Function<T, SpecialList<R>> mapper) {
    return new SpecialList<R>(() -> mapper.apply(this.content));
}

Это означает, что я бы взял функцию типа T и вернул быSpecialList типа R.

Однако я получаю эту ошибку:

SpecialList.java:43: error: no suitable constructor found for SpecialList(()->mapper[...]y(ts))
        return new SpecialList<R>(() -> mapper.apply(this.content));
               ^
    constructor SpecialList.SpecialList(R) is not applicable
      (argument mismatch; R is not a functional interface)
    constructor SpecialList.SpecialList(Supplier<R>) is not applicable
      (argument mismatch; bad return type in lambda expression
          SpecialList<R> cannot be converted to R)
  where R,T are type-variables:
    R extends Object declared in method <R>flatMap(Function<T,SpecialList<R>>)
    T extends Object declared in class SpecialList
Note: Some messages have been simplified; recompile with -Xdiags:verbose to get full output
1 error

У меня есть конструктор SpecialList (), принимающий значение, но так как мой возвращаемый тип теперь 'R 'это, кажется, не работает, и они говорят, что подходящего конструктора не найдено.

Разве тип' R 'не должен быть заменен и стать Т в конструкторе? Почему это дает мне эту ошибку?

1 Ответ

0 голосов
/ 05 ноября 2019

Проблема возникает из аргумента, переданного конструктору:

() -> mapper.apply(this.content) имеет тип Supplier<SpecialList<R>>, а не R и Specialist<R>.

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

public <T, R> SpecialList<R> flatMap(Function<T, SpecialList<R>> mapper) {
    return mapper.apply(this.content);
}
...