2015-05-15 7 views
16

Oto mój przykładowy kod Java:Eclipse - `otwarte zaproszenie hierarchy` zatrzymać wyszukiwanie w łańcuchu lambda

public class Test { 

    public static void main(String[] args) { 
     methodDepth0(
      ()-> 
       methodDepth1(
        ()-> 
         methodDepth2() 
       ) 
     ); 
    } 

    static Object methodDepth2() { 
     return null; 
    } 

    interface MyIF { 
     void call(); 
    } 

    static void methodDepth0(MyIF myIf){ 
     myIf.call(); 
    } 

    interface MyIF2 { 
     void call(); 
    } 

    static void methodDepth1(MyIF2 myIf2){ 
     myIf2.call(); 
    } 
} 

Kiedy otwieram hierarchię wywołania metody methodDepth2() z Eclipse (4.4), open call hierarchy przystanek szukając następnego rozmówcę: open call hierarchy stop searching next caller method

Czego oczekuję jest jak otwarcie hierarchię wywołania metody methodDepth1() które wykazują aż metody main. opening call hierarchy of method <code>methodDepth1()</code> which show until the <code>main</code> method

+0

Szybki patch: https://goo.gl/2R0xH4 – andyf

Odpowiedz

2

Z tego, co mogę powiedzieć, brak głębi hierarchii połączeń wynika z (ponownej) oceny kodu w czasie wykonywania. Zostało to wyjaśnione w 15.27.4 Run-Time Evaluation of Lambda Expressions w specyfikacji języka Java.

W czasie wykonywania ocena wyrażenia lambda jest podobna do oceny wyrażenia tworzenia instancji klasy, o ile zwykłe uzupełnienie tworzy odwołanie do obiektu. Ocena wyrażenia lambda różni się od wykonania ciała lambda.

0

Jako drugi obraz wyraźnie pokazuje, Eclipse jest stanie prześledzić hierarchii połączeń poprzez wywołanie metody myIf.call() wewnątrz methodDepth0. Jest to poprawne, ponieważ (zewnętrzna) lambda implementuje metodę MyIF.call().

Fakt, że ten sam wzór nie działa na następnym poziomie zagnieżdżenia, wygląda na błąd. Proszę wziąć pod uwagę filing a bug dla JDT/UI. TIA.

Wystarczy pamiętać, że dla lambdas wykonawczych typów bibliotek jak Consumer<T> liczba dzwoniących do accept(T) w obszarze roboczym może łatwo stać się niewykonalna, podobnie jak w każdej hierarchii połączeń poprzez np Runnable.run() - ale to nie kwestionuje ogólną użyteczność hierarchii połączeń za pomocą lambd.

+0

Dziękuję, wypełniłem ten błąd: https://bugs.eclipse.org/bugs/show_bug.cgi?id=468561 – andyf