2013-05-20 12 views
5

मैं जावा में जेनेरिक तरीकों को समझने की कोशिश कर रहा हूं।जावा जेनेरिक तरीकों को समझना

public class GenericTest { 

    interface Shape { 
     public long area(); 
    } 

    public static class Triangle implements Shape 
    { 
     private long base, height; 
     public long area() { return (base * height)/2; } 
    } 

    public static class Rectangle implements Shape 
    { 
     private long width, height; 
     public long area() { return width * height; } 
    } 

    public <T extends Shape> long area1(T shape) 
    { 
     return shape.area(); 
    } 

    public long area2(Shape shape) 
    { 
     return shape.area(); 
    } 

} 

मैं नहीं देख सकता/क्यों इस्तेमाल करना चाहिए/area2 (या इसके विपरीत) के बजाय area1 लागू: निम्नलिखित कोड को देखते हुए। क्या मैं कुछ भूल रहा हूँ? दोनों विधियां एक ही काम नहीं करते हैं?

यह मुझे छोड़ दिया है एक सा जावा

+1

पर वास्तव में क्या चल रहा है यह इस मामले में जेनेरिक का उपयोग करने का कोई मतलब नहीं है। जिन मामलों में यह * करता है * समझ में आता है, जब आप नहीं जानते कि आपके पास ** स्टोर ** किस तरह के प्रकार हैं। –

+1

इस मामले में @ लुकासकुथ ने कहा कि आपको क्षेत्र क्षेत्र 2() का एक सामान्य संस्करण बनाने की आवश्यकता नहीं है; हालांकि वर्तमान ओरेकल दस्तावेज जेनेरिक पर महान उदाहरण दिखाता है। वाइल्डकार्ड जेनेरिक उदाहरण भी भ्रम को स्पष्ट करने में मदद कर सकते हैं .. http://docs.oracle.com/javase/tutorial/extra/generics/methods.html –

+0

पर एक नज़र डालें, मैं जेनिक्स को सी ++ के बराबर बराबर देख रहा था टेम्पलेट्स। मुख्य बात यह है कि आपने यहां बताया कि अन्य उत्तरों से कमी है (और संभवतया जो मैं लापता हूं, वह अवधारणा है जिसका उपयोग किया जाता है "जब आप नहीं जानते कि ** किस प्रकार ** स्टोर ** ** जो बिल्कुल है जो मैं जवाब में ढूंढ रहा था :-) – Xaq

उत्तर

4

में के बारे में जेनरिक उलझन में वहाँ area1 विधि बनाने के लिए कोई अच्छा कारण है। area2 विधि बेहतर है। जेनेरिक का उपयोग तब किया जाना चाहिए जब एक विशिष्ट लेकिन अज्ञात प्रकार के साथ संबंध हो। यहां, पैरामीटर shape पैरामीटर के बारे में कुछ भी विशिष्ट नहीं है। इंटरफ़ेस Shape पहले से ही हमें area विधि का उपयोग करने देता है, इसलिए हमें परवाह नहीं है कि Shape का विशिष्ट कार्यान्वयन shape के रूप में पारित किया गया है। तो यहां जेनेरिक की जरूरत नहीं है।

उपयोग

public long area2(Shape shape) 
13

अपने उदाहरण में, के बाद से T प्रकार पैरामीटर किसी भी वापसी मूल्यों में नहीं किया जाता है, वहाँ कोई अंतर नहीं है।

हालांकि, कल्पना करें कि आप निम्न विधियों में था:

public <T extends Shape> T movedShape1(T shape) { 
    return shape.move(); 
} 

public Shape movedShape2(Shape shape) { 
    return shape.move(); 
} 

यहाँ आप movedShape1() उपयोग करने के लिए एक स्पष्ट लाभ देख सकते हैं। किसी भी प्रकार की सुरक्षा खोए बिना, आपको अपने रिटर्न वैल्यू के लिए एक और विशिष्ट प्रकार मिलता है।

+0

क्या वह अभी भी वही नहीं है? मुझे अतिरिक्त प्रकार की सुरक्षा नहीं दिखाई देती है, वे दोनों आकार वापस लौटते हैं? – Xaq

+2

@Xaq: यदि आपके पास कक्षा 'मंडल आकार' लागू करता है, तो 'Circle' पैरामीटर के साथ 'moveShape1()' को कॉल करने से' सर्कल 'नहीं होगा, न कि' आकार '। '' मंडल 'पैरामीटर के साथ' moveShape2() 'को कॉल करने से 'आकार' मिलेगा। – Keppil

+0

@Xaq, केपिल सही है, और जब आप इस तरह की एक विधि को कॉल करते हैं तो यह बहुत उपयोगी होता है। – dantuch

0

मैं यह मामला - आकार एक (सार) कक्षा नहीं बल्कि एक इंटरफेस है, इसलिए इसे लागू किया जाना चाहिए (सोच के ज्ञान के रूप में विस्तारित) - मैं कहूंगा कि वे वही करते हैं, और जेनेरिक जोड़ना है केवल

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