具有相同功能签名的两个接口。

以SimpleStepBuilder.processor为例。

相同功能类型的两个重载。

传递lambda表达式似乎是不可能的。

对或错?

 public SimpleStepBuilder<I, O> processor(ItemProcessor<? super I, ? extends O> processor) {
    this.processor = processor;
    return this;
}

public SimpleStepBuilder<I, O> processor(Function<? super I, ? extends O> function) {
    this.itemProcessorFunction = function;
    return this;
}

public interface ItemProcessor<I, O> {
    @Nullable
    O process(I item) throws Exception;
}

最佳答案

是的,传递任何lambda a -> a.toB()都会导致模棱两可的调用。

但是至少有两个选择:传递匿名类*,强制转换为适当的类型。

processor((Function<String, Integer>) s -> s.length());       // Function
processor((ItemProcessor<String, Integer>) s -> s.length());  // ItemProcessor


*这不是lambda表达式,请划掉!

可能有助于调用这些方法的一些技巧:

如果ItemProcessor扩展了Function,则将不需要转换为ItemProcessor

interface ItemProcessor<I, O> extends Function<I, O> {}

processor((Function<String, Integer>) String::length);  // Function
processor(s -> s.length());                             // ItemProcessor

10-07 13:21
查看更多