Java 8 Consumer/Function Lambda Ambiguity
我有一个重载方法,它分别采用 Consumer 和 Function 对象,并返回与相应的 Consumer/Function 匹配的泛型类型。我认为这很好,但是当我尝试使用lambda表达式调用任一方法时,我收到一个错误,指示对该方法的引用是模棱两可的。
根据我对JLS §15.12.2.1的阅读。确定可能适用的方法:编译器似乎应该知道,具有 void 块的 lambda 与 Consumer 方法匹配,而具有返回类型的 lambda 与 Function 方法匹配。
我将以下无法编译的示例代码放在一起:
import java.util.function.Consumer;
import java.util.function.Function;
public class AmbiguityBug {
public static void main(String[] args) {
doStuff(getPattern(x -> System.out.println(x)));
doStuff(getPattern(x -> String.valueOf(x)));
}
static Pattern<String, String> getPattern(Function<String, String> function) {
return new Pattern<>(function);
}
static ConsumablePattern<String> getPattern(Consumer<String> consumer) {
return new ConsumablePattern<>(consumer);
}
static void doStuff(Pattern<String, String> pattern) {
String result = pattern.apply("Hello World");
System.out.println(result);
}
static void doStuff(ConsumablePattern<String> consumablePattern) {
consumablePattern.consume("Hello World");
}
public static class Pattern<T, R> {
private final Function<T, R> function;
public Pattern(Function<T, R> function) {
this.function = function;
}
public R apply(T value) {
return function.apply(value);
}
}
public static class ConsumablePattern<T> {
private final Consumer<T> consumer;
public ConsumablePattern(Consumer<T> consumer) {
this.consumer = consumer;
}
public void consume(T value) {
consumer.accept(value);
}
}
}
我还发现了一个类似的堆栈溢出帖子,结果证明是一个编译器错误。我的情况非常相似,虽然有点复杂。对我来说,这看起来仍然是一个错误,但我想确保我没有误解lambda的语言规范。我使用的是Java 8u45,它应该具有所有最新的修复程序。
如果我将方法调用更改为包装在块中,则所有内容似乎都可以编译,但这会增加额外的冗长,并且许多自动格式化程序会将其重新格式化为多行。
doStuff(getPattern(x -> { System.out.println(x); }));
doStuff(getPattern(x -> { return String.valueOf(x); }));