具有相同功能签名的两个接口。
以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