2015-08-26 9 views
7

Dieser Code:Kann nicht überladene Methode mit generischen Lambda lösen

public static void f(String[] args) {} 
public static void f(Integer[] args) {} 

public static void main(String[] args) 
{ 
    f(Stream.of("xxx").toArray(i -> new String[i])); 
} 

kompiliert Erfolg mit jdk8u45 aber jdk8u60 druckt die folgende Fehlermeldung:

Error:(17, 9) java: reference to f is ambiguous 
    both method f(java.lang.String[]) in type_infer.Test and method f(java.lang.Integer[]) in type_infer.Test match 

Ist es die JSL folgen, Warum Compiler kann nicht Überladene Methoden auflösen? War es ein fester Fehler in jdk8u45?

+2

Weitere Informationen: kompiliert in javac 1.8.0_25, 1.8.0_40, ecj 3.10.2; schlägt mit der gleichen Nachricht in javac 1.9.0-ea-b72 fehl. Interessanter ist, dass das Ersetzen von 'i -> new String [i]' mit 'String [] :: new' das Problem in javac 1.9.0-ea-b72 behebt. –

+2

ich glaube, es ist behoben, ich versuchte es in ideone, und es ist mit sun jdk 8u51 hier ist Link http://ideone.com/wvCXyO – user902383

+0

Und mit jdk1.8.0_60 ersetzt ich -> neue String [i] mit String [] :: new behebt das Problem nicht. – And390

Antwort

1

Das sieht wie ein Fehler aus, der vor kurzem in javac eingeführt wird. Das Argument im Aufruf an f(..) ist eindeutig vom Typ String[].

String s1 = Stream.of("xxx").toArray(i -> new String[i])[0]; 
String[] s2 = Stream.of("xxx").toArray(i -> new String[i]).clone(); 

Diese sind von allen Versionen von Compilern akzeptiert: Dies kann beispielsweise durch Auflösen des gleichen Ausdrucks als eigenständigen Ausdruck dargestellt werden.

Offensichtlich ist f(Integer[]) nicht anwendbar mit einem Argument vom Typ String[]. Ich sehe keinen Grund, warum der äußere Typschluss die innere Auflösung zu einem schlechteren Ergebnis (z. B. Object[]) zwingen würde als die Auflösung als eigenständiger Ausdruck.

Ein zusätzlicher Beweis: die folgende Aussage richtig abgelehnt selbst von diesen Versionen von javac von diesem Fehler betroffen:

Integer[] s3 = Stream.of("xxx").toArray(i -> new String[i]); 

Daher f(Integer[]) deutlich aus der Rechnung ist.

1

Sie bekommen die Schmerzen von einem bekannten Fehler in der Jvm http://bugs.java.com/bugdatabase/view_bug.do?bug_id=8029718 nicht sicher, wie die „feste Version“ beziehen sich auf die auf der Oracle Website aufbaut. Aber trotzdem sollten Sie in der neuesten Version arbeiten und Ihre Ergebnisse in diesem Fehler melden. Vielleicht haben sie es behoben und jetzt gibt es eine Regression.

+0

Ein JVM-Fehler würde den Kompilierungsfehler nicht erklären, aber der von Ihnen angegebene Fehler wird tatsächlich javac zugewiesen. OTOH, dieser Bug wurde für 8u20 behoben, daher ist der Fix * in allen in der Frage erwähnten Versionen plus Kommentaren verfügbar. –

Verwandte Themen