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.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage