使用 lambda 和泛型时对方法的引用不明确
我在以下代码上收到错误,我认为不应该在那里...使用 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) {
}
}
错误如下:
错误:(17, 9) java: 引用消费者IntFunctionTest是模棱两可的 两种方法消费者IntFunctionTest(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);
我相信不应该有错误,因为所有引用都是类型,并且它们都没有返回值。正如你所观察到的,当我显式扩展 lambda 时,它确实有效。Arrays::sort
void
Consumer<T>
这真的是javac中的一个错误,还是JLS声明在这种情况下lambda无法自动扩展?如果是后者,我仍然会认为它很奇怪,因为第一个参数不应该匹配。consumerIntFunctionTest
Function<T, ?>