flatMap的方法级别通用键入

时间:2019-11-05 10:35:08

标签: java oop functional-programming stream lazy-evaluation

我目前正在研究惰性流的SpecialList实现,并且需要实现平面图功能。

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

这意味着我将使用T类型的函数并返回R类型的SpecialList。

但是,我遇到此错误:

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'类型并在构造函数中成为T吗?为什么会给我这个错误?

1 个答案:

答案 0 :(得分:1)

问题来自传递给构造函数的参数:

() -> 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);
}