我在以下代码中遇到了错误,但我认为这里不应该有错误... 使用JDK 8u40编译此代码。
public class Ambiguous {
public static void main(String[] args) {
consumerIntFunctionTest(data -> {
Arrays.sort(data);
}, int[]::new);
consumerIntFunctionTest(Arrays::sort, int[]::new);
}
private static <T> void consumerIntFunctionTest(final Consumer<T> consumer, final IntFunction<T> generator) {
}
private static <T> void consumerIntFunctionTest(final Function<T, ?> consumer, final IntFunction<T> generator) {
}
}
错误信息如下:
错误发生在以下代码行:Error:(17, 9) java: reference to consumerIntFunctionTest is ambiguous both method consumerIntFunctionTest(java.util.function.Consumer,java.util.function.IntFunction) in net.tuis.ubench.Ambiguous and method consumerIntFunctionTest(java.util.function.Function,java.util.function.IntFunction) in net.tuis.ubench.Ambiguous match
consumerIntFunctionTest(Arrays::sort, int[]::new);
我认为不应该出现错误,因为所有的
Arrays::sort
引用都是void
类型的,没有任何一个返回值。正如你所观察到的,当我明确扩展Consumer<T>
lambda时,它确实起作用。这真的是javac的一个bug吗?或者JLS规定lambda在这种情况下不能自动扩展?如果是后者,我仍然认为这很奇怪,因为带有第一个参数
Function<T, ?>
的consumerIntFunctionTest
不应该匹配。
Function<T, ?>
不匹配??
同样可以是Void
,因此它是匹配的。 - tomse