2013-03-01 9 views
6

मैं जावा 8 की नई बंद सुविधाओं का परीक्षण कर रहा हूं; क्यों कोडजावा 8 बंद और पहचान पहचान

public class Test8 { 
    private class A { int a;} 
    private class B { int b;}  
    interface IFA { void ifa(A param); } 
    interface IFB { void ifb(B param); } 
    private void forceA(A expr) { }  
    private void z(IFA fun) { System.out.println("A"); fun.ifa(new A()); } 
    private void z(IFB fun) { System.out.println("B"); fun.ifb(new B()); }  

    public void run() { 
     z(x -> forceA(x)); 
    } 
    public static void main(String args[]) { new Test8().run(); } 
} 

के इस टुकड़े त्रुटि देता है मैं सोच रहा हूँ: रन विधि में जेड मंगलाचरण पर both method z(IFA) in Test8 and method z(IFB) in Test8 match error

संकलक पता लगाने के लिए कि forceA मंगलाचरण बलों एक्स प्रकार का होना करने में सक्षम नहीं है ए और इस प्रकार सही z उपयोग करने के लिए z(IFA fun) है?

(एक समान कार्य प्रतिनिधि का उपयोग करते हुए सी # में कानूनी है;? वहाँ एक रास्ता जावा 8 में एक ही परिणाम प्राप्त करने के लिए है)

+2

यदि यह संकलित नहीं होता है, तो संकलक स्पष्ट रूप से समझने के लिए पर्याप्त स्मार्ट नहीं है। –

उत्तर

3

जावा 8 अभी भी एक काम प्रगति पर है। नवीनतम नमूना आपके कोड को काम करने की अनुमति देता है। कंपाइलर कार्यान्वयन जल्द ही पकड़ना चाहिए।

फिर भी, इस प्रकार का अधिभार एक अच्छी शैली नहीं है। जब javac देखता

z(arg->{ block }) 

यह स्पष्ट नहीं है जो z() लागू होता है हम तो हस्ताक्षर

z(A->void) 
    z(B->void) 

है। एक चुनने के लिए अतिरिक्त काम किया जाना चाहिए (ब्लॉक संकलित करके)।

हमें वास्तव में परवाह नहीं है कि यह जावैक के लिए कितना मुश्किल है। असली मुद्दा यह है कि, जब कोई मनुष्य उस कोड को देखता है, तो मनुष्य को यह समझने के लिए गहराई से खोदना पड़ता है कि z() को संदर्भित किया गया है। बहुत पठनीय नहीं है।

अंगूठे के नियम के रूप में, एक ही arity के कार्यात्मक इंटरफेस के साथ एक विधि अधिभार से बचें। विभिन्न arities ठीक हैं, वहाँ स्पष्ट करने के लिए कोई समस्या नहीं है, मानव या javac

z(arg->{...}) 

    z((arg1,arg2)->{...}) 

अधिक भार का दूसरा रूप भी डिजाइनरों (दान स्मिथ आदि) का आशीर्वाद है के लिए - एक ही arity, एक ही पैरामीटर प्रकार है, लेकिन विभिन्न वापसी प्रकार

z(X->R1) 
    z(X->R2) 

लेकिन मुझे लगता है कि यह भी बहुत भ्रमित है और मैं इससे बचूंगा।

+0

धन्यवाद, मैं संकलक के नए संस्करण के साथ जल्द ही इसे प्रकाशित करने की कोशिश करूंगा। मुझे पता है कि यह एक अच्छी शैली नहीं है, लेकिन मैं केवल भाषा (बंद) क्षमताओं का परीक्षण कर रहा था। – Vor

0

लैम्ब्डा के शरीर अपने प्रकार निर्धारित करने के लिए किया जाता है। तरीकों की तरह। मुझे लगता है कि एक विधि संदर्भ काम कर सकता है। लेकिन euw, overloading।

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