2015-08-26 20 views
7

ten kod:Nie można rozwiązać metodą przeładowany generycznego lambda

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])); 
} 

kompiluje sukces z jdk8u45 ale jdk8u60 drukuje się następujący błąd:

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 

nie wynika z JSL, dlaczego kompilator nie może rozwiązać przeciążone metody? Czy był to naprawiony błąd w jdk8u45?

+2

Więcej informacji: kompilacja dobrze w javac 1.8.0_25, 1.8.0_40, ecj 3.10.2; kończy się niepowodzeniem z tym samym komunikatem w javac 1.9.0-ea-b72. Bardziej interesujące jest to, że zamiana 'i -> new String [i]' na 'String [] :: new' rozwiązuje problem w javac 1.9.0-ea-b72. –

+2

Naprawiłem i naprawiłem, wypróbowałem to w ideowym, i używa Sun jdk 8u51 tutaj jest link http://ideone.com/wvCXyO – user902383

+0

I z jdk1.8.0_60 zastępując i -> new String [i] z String [] :: new nie rozwiązuje problemu. – And390

Odpowiedz

1

To wygląda jak błąd wprowadzony ostatnio w javac.

Argument w wywołaniu f(..) jest wyraźnie typu String[]. Można, na przykład, być przedstawiony przez rozwiązanie tego samego wyrażenia w postaci samodzielnej ekspresji:

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

Te są akceptowane przez wszystkie wersje kompilatorów.

Oczywiście, f(Integer[]) nie ma zastosowania z argumentem typu String[]. Nie widzę powodu, dla którego zewnętrzne wnioskowanie zmusiłoby wewnętrzną rozdzielczość do gorszego wyniku (np. Object[]) niż rozdzielczość jako samodzielne wyrażenie.

Dodatkowy dowód: poniższe zestawienie jest poprawnie odrzucony nawet przez tych wersjach javac dotkniętych przez ten błąd:

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

Stąd f(Integer[]) jest wyraźnie z rachunku.

1

Dostaniesz ból od znanego błędu w JVM http://bugs.java.com/bugdatabase/view_bug.do?bug_id=8029718 Nie wiesz, jak odnosić się do „stałe wersji” do buduje dostępny na stronie internetowej Oracle. Ale mimo to powinieneś pracować w najnowszej wersji i zgłosić swoje odkrycia w tym błędzie. Może to naprawili i teraz jest regresja.

+0

Błąd jvm nie wyjaśniłby błędu kompilacji, ale błąd, który cytujesz, jest faktycznie przypisany do javac. OTOH, ten błąd został naprawiony na 8u20, więc poprawka * jest * dostępna we wszystkich wersjach wymienionych w pytaniu plus komentarze. –

Powiązane problemy