Java generics - map of formatters -


इस सवाल का पहले से ही एक उत्तर है: < / P>

  • 2 जवाब

    Formatter & lt; T & gt; जानता है कि स्ट्रिंग में T प्रारूप कैसे करना है:

      सार्वजनिक इंटरफ़ेस फॉर्मेटर & lt; T & gt; {स्ट्रिंग प्रारूप (अंतिम टी टी); }   

    मुझे फ़ॉर्मेटर्स का मानचित्र करना है, एक पूर्णांक के लिए, एक दिनांक आदि: <पूर्व> मानचित्र & lt; कक्षा, फॉर्मेट & gt; formatters;

    इरादा उपयोग होगा:

      formatters.put (पूर्णांक। वर्ग, नया फॉर्मेटर & lt; पूर्णांक & gt; () {सार्वजनिक स्ट्रिंग प्रारूप (पूर्णांक i) {रिटर्न i.toString;}});   

    क्या कुछ मान लागू करने के लिए कि मूल्य-मान वर्ग प्रकार से सहमत होंगे? अगर मैं डाल (पूर्णांक। वर्ग, नया फॉर्मेटर & lt; पूर्णांक & gt; () {...}} यह काम करेगा लेकिन डाल (पूर्णांक। वर्ग, नया फॉर्मेटर & lt; दिनांक & gt; () {...}) नहीं होगा?

    क्या मैं अब कोशिश कर रहा हूँ उपयोग करने के लिए है? प्रकार के रूप में:

      मानचित्र & lt; कक्षा & lt;? & Gt ;, Formatter & lt;? & Gt; & gt; formatters;   

    लेकिन तब मैं इस मैप के अंदर फॉर्मेटर्स का उपयोग नहीं कर सकता:

      वस्तु obj = Integer.valueOf (15); । Formatters.get (obj.getClass ()) प्रारूप (obj); त्रुटि: विधि स्वरूप (कैप्चर # 3-का?) प्रकार फ़ॉर्मेटर में & lt; कैप्चर # 3-का? & Gt;   

    कोई भी स्पष्टीकरण स्वागत होगा।

    दुर्भाग्यवश आप कुछ पहले घोषित & lt; T & gt; सामान्य प्रकार के बिना कुंजी और मानों के बीच ऐसा संबंध नहीं बना सकते। इसके अलावा इस तरह के वर्ग के लिए तय नहीं किया जाना चाहिए ताकि प्रत्येक put इनवॉन्स में बदलने में सक्षम होना चाहिए।

    यदि यह एक विकल्प है, तो सामान्य प्रकार के साथ विधि का उपयोग करने पर विचार करें

      @SuppressWarnings ("अनचेक") सार्वजनिक स्थिर & lt; T & gt; शून्य रखासैफ़ (कक्षा & lt; T & gt; कुंजी, फॉर्मेटर & lt; T & gt; मान) {formatters.put (कुंजी, (फॉर्मेटर & lt; ऑब्जेक्ट & gt;) मान); }   

    जो कुछ मानों को मानचित्र में डाल देगा जो आपके क्लास में निजी क्षेत्र उदाहरण के लिए हो सकता है

      निजी स्थिर मानचित्र & lt; Class & lt;? & Gt ;, Formatter & lt ; वस्तु & gt; & gt; फ़ॉर्मेटर्स = नया हैशमॉप & lt; कक्षा & lt;? & Gt ;, फॉर्मफ़र & lt; ऑब्जेक्ट & gt; & gt; ();   

    इसके अलावा आप फ़ॉर्मेट विधि से फ़ॉर्मेटर & lt?? & Gt; संदर्भ का उपयोग नहीं कर सकते हैं इस प्रकार का संदर्भ formatter & lt; integer & gt; या formatter & lt; दिनांक & gt; या किसी अन्य प्रकार की फॉर्मेटर और कंपाइलर को निर्धारित कर सकता है कि आप वहां किस प्रकार का उपयोग कर रहे हैं एक जोखिम है कि आप formatter & lt; date & gt; पर पूर्णांक ऑब्जेक्ट (यह वही समस्या है क्यों जावा आपको add विधि का उपयोग नहीं करने देगा सूची & lt;? & gt; संदर्भ - क्योंकि हम नहीं जानते कि किस प्रकार की सूची संदर्भ में जोड़ना (नया केला) निष्पादित करने की अनुमति देता है, यदि वास्तव में सूची में सूची इस समस्या को हल करने के लिए आप स्पष्ट रूप से यह कह सकते हैं कि नक्शा Formatter & lt; ऑब्जेक्ट & gt; को संग्रहित करेगा और उस के लिए धन्यवाद फ़ॉर्मेट किसी भी प्रकार के डेटा को तब तक स्वीकार कर पाएगा जब तक वह ऑब्जेक्ट का विस्तार न करे। इस दृष्टिकोण के साथ ही समस्या यह है कि formatter & lt; ऑब्जेक्ट & gt; formatter & lt; integer & gt; [1] के संदर्भ में नहीं हो सकता है, इसलिए आपको स्पष्ट रूप से पास किए गए फॉर्मेटर्स को Formatter & lt; ऑब्जेक्ट & gt; जो आमतौर पर असुरक्षित हो सकते हैं [2] और आप इसके बारे में संकलक को चेतावनी देंगे, लेकिन इस मामले में आपको ठीक नहीं होना चाहिए ताकि आप इस चेतावनी को दबा सकें।


    [1] जैसा सूची & lt; फल & gt; सूची & lt; Apple & gt; के संदर्भ में नहीं हो सकता है, क्योंकि फलों की सूची के जरिए आप होंगे सूची से सूची & lt; banana & gt; सूची में केले को जोड़ने में सक्षम
    [2] कोड> आम तौर पर सबसे अच्छा विचार नहीं है और कंपाइलर हमें ऐसे दृष्टिकोण के बारे में चेतावनी देगा

Comments

Popular posts from this blog

asp.net - Procedure or function "Procedure name" expects a parameter "Param name" which was not supplied occurs rarely -

c# - The item with identity 'Id' already exists in the metadata collection. Parameter name: item -

c++ - Redefined variable in the other module -