<T>

2013-02-12 6 views
7

मैं समझ इस तरह के सामान्य विधि मंगलाचरण के साथ एक समस्या है के साथ सामान्य विधि मंगलाचरण:<T>

object = ObjectGenerator.<T> getObject(objectName); 

यहाँ ऊपर स्थिति के लिए एक संदर्भ आता है:

class GenClass<T> { 

    private T object; 

    // ... some code 

    public void initObject(String objectName) { 
     object = ObjectGenerator.<T> getObject(objectName); 
    } 
} 

class ObjectGenerator { 

    public static <T extends Object> T getObject(String name) { 
     // some code 
     return someObject; 
    } 
} 

सवाल क्या भूमिका <T>getObject(objectName) से पहले चलाया जाता है मंगलाचरण?

+1

+1 क्योंकि मैंने इसे पहले नहीं देखा था। –

+0

मैं इसके बारे में नहीं पूछ रहा हूं लेकिन कोड की लगभग एक पंक्ति है। मैं विधि हस्ताक्षर बदल सकता हूं '<टी ऑब्जेक्ट> टी getObject (स्ट्रिंग नाम, कक्षा क्लैज) बढ़ाता है - इससे कोई फर्क नहीं पड़ता। ' 'के साथ उस विधि के आमंत्रण के साथ केवल यह एक पंक्ति मुझे – emka86

उत्तर

7

नोट: आपके द्वारा दिए गए विशिष्ट उदाहरण में, ObjectGenerator.getObject(objectName); को ठीक संकलित करना चाहिए।

T object; 
object = ObjectGenerator.getObject(objectName); 

लौटे प्रकार T होना चाहिए:

कुछ स्थितियों में, प्रकार निष्कर्ष तंत्र तथ्य यह है कि में समाधान नहीं किया जा सकता है। ऐसे मामले में, आपको संकुचन प्रकार को स्पष्ट रूप से इंगित करने के लिए संकलक को थोड़ा सा सहायता देने की आवश्यकता है।

class Example { 
    public static <T> List<T> m1() { 
     return m2(Arrays.<T> asList()); //Arrays.asList() would not compile 
    } 
    public static <T> List<T> m2(List<T> l) { 
     return l; 
    } 
} 
+0

के लिए भ्रमित कर रही है" किस प्रकार परिस्थिति तंत्र "को यह जानने में सक्षम नहीं होगा कि लौटाया गया प्रकार क्या होना चाहिए? – asteri

+0

@ जेफ मैंने एक उदाहरण जोड़ा है - यह होने पर सटीक स्थितियां [प्रकार अनुमान नियम] (http://docs.oracle.com/javase/specs/jls/se7/html/jls- 15.html # जेएलएस -15.12.2.7), जो जेएलएस के पीडीएफ संस्करण में लगभग 12 पृष्ठ लंबे हैं, इसलिए ईमानदार होने के लिए पूरी तरह से सुनिश्चित नहीं हैं। अंत में जिस तरह से मैं इसे देखता हूं: या तो यह स्पष्ट प्रकार के बिना संकलित करता है और मैं खुश हूं या यह नहीं करता है और मैं इसे जोड़ता हूं ... – assylias

+0

हाँ, मुझे मिल गया! यह मेरे लिए बहुत अच्छी व्याख्या है और इस लिंक को आपके लिंक से देखकर मुझे लगता है कि खोजने के लिए कई और ग़लत स्थितियां हैं! :) – emka86

0

object टी

के बच्चे हो सकता है पाठ्यक्रम getObject के

बेहतर परिभाषित किया जाना चाहिए था:

public static <T> T getObject(Class<T> objectClass, String name) { 
    return objectClass.getConstructor(String.class).newInstance(name); 
    //return objectClass.getConstructor().newInstance(); 
} 

अन्यथा कोई प्रकार सुरक्षित निर्माण संभव है, तथाकथित प्रकार विलोपन के कारण है।

-1
object = ObjectGenerator.getObject(objectName); 

हमेशा वस्तु की वस्तु के बाद से आप एक स्थिर विधि बुला रहे हैं देता है:

यहाँ एक काल्पनिक उदाहरण है, जहां आप स्पष्ट रूप से सामान्य प्रकार निर्दिष्ट करने की आवश्यकता है। स्पष्ट रूप से सामान्य वस्तु प्राप्त करने के लिए आप अपने कोड में, टी के लिए इस्तेमाल किया है,

object = ObjectGenerator.<T> getObject(objectName); 

<T> स्थिर संदर्भ में प्रयोग किया जाता है। गैर स्थैतिक आमंत्रण के लिए इसकी आवश्यकता नहीं है।

+0

-1 स्टेटिक संदर्भ में स्पष्ट रूप से प्रकार के तर्क प्रदान करने के साथ कुछ भी नहीं है। –

+0

मुझे प्रबुद्ध करने के लिए धन्यवाद :) – prasanth

0

मुझे यहां कुछ मिला: https://stackoverflow.com/a/338906/443427 यह आपकी मदद कर सकता है।

मैं क्या पढ़ा जेनेरिक कि संकलक लौटा मान प्रकार गणना करने के लिए उपयोग करना चाहिए का प्रतिनिधित्व कर सकते से

, एक नोट यह भी ठीक से काम (जाँच ObjectGenerator टी से अलग है) के रूप में सामान्य आगे

पारित करने के लिए:

public class ObjectGenerator<X> { 
    public static <T extends Object> Set<T> getObject(String name) { 
    // some code 
    return null; 
    } 
} 
0

मैं नहीं पूरी तरह से स्वीकार किए जाते हैं जवाब है, जिसमें यह कहते हैं के साथ सहमत:

इस तरह के एक मामले में, आप स्पष्ट रूप सेद्वारा संकलक थोड़ी सी मदद देने की जरूरत हैआपके द्वारा अपेक्षित रिटर्न प्रकार को इंगित करता है।

यह मेरे लिए सही नहीं है। जैसा कि मैं सामान्य विधि को समझता हूं और अनुमान लगाता हूं, स्क्वायर ब्रैकेट में प्रदान किया गया प्रकार सीधे जेनेरिक विधि के रिटर्न प्रकार को इंगित नहीं करता है। इसके बजाय, टाइप T जेनेरिक विधि से जुड़े रिटर्न प्रकार, तर्क प्रकार, स्थानीय चर प्रकार हो सकता है।

असल में, अनुमान तंत्र को टाइप करने के लिए धन्यवाद, हमें ज्यादातर मामलों में टाइप पैरामीटर T निर्दिष्ट करने की आवश्यकता नहीं है (न केवल कुछ स्थितियों में)। आपके उदाहरण में, <T> को अधिकांश अन्य मामलों में विधि आमंत्रण ObjectGenerator.<T> getObject(objectName) से सुरक्षित रूप से छोड़ा जा सकता है। ऐसा इसलिए है क्योंकि जेनेरिक विधि के प्रकार T को से आसानी से अनुमानित किया जा सकता है कि परिणाम असाइन किया जा रहा है, या लौटाया गया है। दूसरे शब्दों में, चूंकि आप विधि आमंत्रण से पहले private T object घोषित करते हैं, इसलिए T टाइप T के रूप में सफलतापूर्वक अनुमानित किया जाएगा।

मेरे दावा a definitive tutorial से निम्न कथन द्वारा समर्थित किया जा सकता है:

प्रकार निष्कर्ष एक जावा संकलक के प्रकार तर्क निर्धारित करने के लिए (या तर्क) प्रत्येक विधि मंगलाचरण को देखने के लिए क्षमता और इसी घोषणा है जो आमंत्रण लागू करता है। अनुमान एल्गोरिदम तर्कों के प्रकार निर्धारित करता है, और यदि उपलब्ध है, तो परिणाम जिस प्रकार परिणाम दिया जा रहा है, या लौटाया गया है। अंत में, अनुमान एल्गोरिदम सबसे विशिष्ट प्रकार खोजने का प्रयास करता है जो सभी तर्कों के साथ काम करता है। कैसे काम करता है के बारे में अनुमान

दो उदाहरण:

static <T> T pick(T a1, T a2) { return a2; } 
Serializable s = pick("d", new ArrayList<String>()); 

प्रकार T घोषित समनुदेशिती प्रकार के आधार पर Serializable के रूप में मान लिया जाता है।

public static <U> void addBox(U u, java.util.List<Box<U>> boxes) {} 
BoxDemo.<Integer>addBox(Integer.valueOf(10), listOfIntegerBoxes); 

प्रकार U पारित कर दिया तर्क के प्रकार के आधार Integer के रूप में मान लिया जाता है (अर्थात।, Integer.valueOf(10) प्रकार Integer की है)। इसलिए, <Integer> को ऊपर दिए गए विधि आमंत्रण से सुरक्षित रूप से छोड़ा जा सकता है।

सारांशित करने के लिए, जब तक कि हम सामान्य तर्क के प्रकार पैरामीटर को अपने तर्क प्रकार से टाइप नहीं कर पाएंगे या जिस प्रकार परिणाम दिया जा रहा है या लौटाया गया है (विधि का आविष्कार करते समय), हम प्रकार विनिर्देश को सुरक्षित रूप से छोड़ सकते हैं विधि आमंत्रण से ठीक पहले।

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