2015-05-15 2 views
16

यहाँ मेरी नमूना जावा कोड है लैम्ब्डा श्रृंखला में खोज रोक:ग्रहण `ओपन कॉल hierarchy`

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

जब मैं ग्रहण से विधि methodDepth2() की कॉल पदानुक्रम (4.4), खोलने open call hierarchy अगले फोन करने वाले खोज रोक: open call hierarchy stop searching next caller method

मैं क्या उम्मीद विधि methodDepth1() जो main विधि जब तक दिखाने की कॉल पदानुक्रम खोलने की तरह है। opening call hierarchy of method <code>methodDepth1()</code> which show until the <code>main</code> method

+0

एक त्वरित पैच: https://goo.gl/2R0xH4 – andyf

उत्तर

2

कॉल पदानुक्रम गहराई की कमी के बारे में मैं बता सकता हूं कि रनटाइम पर कोड का मूल्यांकन (पुनः) है। यह जावा भाषा विशिष्टता में 15.27.4 Run-Time Evaluation of Lambda Expressions में समझाया गया है।

रन समय पर, लैम्ब्डा अभिव्यक्ति का मूल्यांकन क्लास इंस्टेंस सृजन अभिव्यक्ति के मूल्यांकन के समान होता है, सामान्य सामान्य समापन के रूप में किसी ऑब्जेक्ट का संदर्भ उत्पन्न होता है। लैम्ब्डा अभिव्यक्ति का मूल्यांकन लैम्ब्डा शरीर के निष्पादन से अलग है।

0

जैसा कि दूसरे चित्र स्पष्ट रूप से पता चलता है, ग्रहण methodDepth0 अंदर विधि कॉल myIf.call() के माध्यम से कॉल पदानुक्रम पता लगाने में सक्षम है। यह सही है, क्योंकि (बाहरी) लैम्ब्डा विधि MyIF.call() लागू करता है।

तथ्य यह है कि एक ही पैटर्न अगले घोंसले स्तर में काम नहीं करता है, यह एक बग की तरह दिखता है। कृपया जेडीटी/यूआई के लिए filing a bug पर विचार करें। TIA।

बस ध्यान दें, कि Consumer<T> तरह पुस्तकालय प्रकार लागू करने lambdas के लिए, एक कार्यक्षेत्र में कॉल की संख्या accept(T) में आसानी के माध्यम से अनियंत्रित, किसी भी कॉल पदानुक्रम के समान है, हो सकता है जैसे, Runnable.run() - लेकिन यह है कि सामान्य उपयोगिता पर सवाल खड़ा नहीं करता है लैम्बडास के माध्यम से कॉल पदानुक्रमों का।

+0

धन्यवाद, मैंने यह बग भर दिया है: https://bugs.eclipse.org/bugs/show_bug.cgi?id=468561 – andyf

संबंधित मुद्दे