2017-08-03 78 views

Odpowiedz

1

typu wnioskowanie do wyrażenia lambda dzieje od rodzaju docelowej, czyli kiedy piszesz coś takiego na przykład:

() -> ""; 

czyli rzeczywiście Supplier (do ciebie, a nie kompilator) ale co jeśli mam typ zadeklarowany tak:

static interface Producer<T> { 
    T produce(); 
} 

oznacza to, że lambda może być Producer lub Supplier. Dlatego przypisanie musi być do @FunctionalInterface (lub rzutowania), aby możliwe było wnioskowanie o typie.

W JLS Są one definiowane jako wyrażenia poli (zależą od kontekstu, w którym zostały one użyte - jak generycznych referencyjną metodą, operator trójskładnikowy)

+0

dziękuję, dokładna odpowiedź, której szukałem. – marsouf

3

Implementacja wyrażeń Lambda @FunctionalInterface - interfejs z tylko jedną publiczną metodą niestatyczną i inną niż domyślna. W pierwszym przypadku kompilator dostaje typ od lewej strony - Object, ponieważ nie może wywnioskować typu twojego wyrażenia lambda. Kompilator nie wybierze dla ciebie żadnego interfejsu. I Object nie implementuje funkcjonalnego interfejsu, więc kompilator narzeka na tę sytuację.

W drugim przypadku korzystania funkcjonalny interfejs Supplier<T> i przypisać go do Object który jest poprawny pod względem kompilacji - kompilator zaspokoić bo oddasz swój specyficzny typ (Supplier<T> w tym przypadku) do najbardziej ogólnego Object (każdy klasa dziedziczy po klasie Object).

+0

zmienna typu obiekt może być skierowany do interfejsu funkcjonalnego nie? myślę, że przyczyna błędów pochodzi z kompilatora nie można wywnioskować dokładny typ wyrażenie po prawej stronie, który mógłby wskazywać na dowolny interfejs funkcjonalny posiadający sygnatury jego abstrakcyjnej metody jako "String someName()" nie? – marsouf

+1

Prawidłowo. Kompilator nie może określić dokładnego typu, ponieważ puste wyrażenie lambda może być reprezentowane przez wiele różnych funkcjonalnych interfejsów. Java jako statycznie skompilowany język musi znać dokładny typ na poziomie kompilacji i nie może wybrać odpowiedniego typu. Tak to rozumiem. –