Bei der Verwendung von Lambdas und Generika ist die Bezugnahme auf die Methode nicht eindeutig.
Ich erhalte eine Fehlermeldung bezüglich des folgenden Codes, der meiner Meinung nach nicht vorhanden sein sollte. Verwenden von JDK 8u40 zum Kompilieren dieses Codes.
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) {
}
}
Der Fehler ist der folgende:
Error: (17, 9) java: Referenz auf consumerIntFunctionTest ist mehrdeutig. Beide Methoden consumerIntFunctionTest (java.util.function.Consumer, java.util.function.IntFunction) in net.tuis.ubench.Ambiguous und method consumerIntFunctionTest (java.util .function.Function, java.util.function.IntFunction) in net.tuis.ubench.Ambiguous match
Der Fehler tritt in der folgenden Zeile auf:
consumerIntFunctionTest(Arrays::sort, int[]::new);
Ich glaube, es sollte keinen Fehler geben, da alleArrays::sort
Referenzen sind vom Typvoid
und keiner von ihnen gibt einen Wert zurück. Wie Sie sehen können, ist es does Arbeit, wenn ich das @ explizit erweiteConsumer<T>
Lambda.
Ist das wirklich ein Fehler in Javac oder gibt die JLS an, dass das Lambda in diesem Fall nicht automatisch erweitert werden kann? Wenn es das letztere ist, würde ich es immer noch seltsam finden, daconsumerIntFunctionTest
mit als erstem ArgumentFunction<T, ?>
sollte nicht übereinstimmen.