2016-02-24 7 views
6

पर इटरेटिंग मैं this one के समान विषम कंटेनर का उपयोग कर रहा हूं। मैं आसानी से कंटेनर से रख सकते हैं और प्राप्त वस्तुओं:विषम कंटेनर

Favorites f = new Favorites(); 
f.putFavorite(String.class, "Java"); 
String someString = f.getFavorite(String.class); 

लेकिन वहाँ इस तरह के कंटेनर से अधिक पुनरावृति करने के लिए कोई आसान तरीका होने लगते हैं। मैं Favorites वर्ग के लिए एक keySet() विधि जोड़ सकते हैं और आंतरिक Map वस्तु की कुंजी सेट वापसी:

public Set<Class<?>> keySet() { 
    return favorites.keySet(); 
} 

अब, मैं चाबियाँ पर पुनरावृति करना चाहते हैं, कुंजी का उपयोग संबद्ध मानों प्राप्त करने के लिए, और प्राप्त वस्तुओं पर कुछ तरीकों फोन:

for (Class<?> klass : f.keySet()) { 
    // f.getFavorite(klass).<SOME_METHOD_SPECIFIC_TO_THE_CLASS-KEY> 
} 

मैंने सोचा था कि मैं klass.cast(f.getFavorite(klass)).SOME_METHOD() फोन करके मेरी कंटेनर में आयोजित वस्तुओं की विधियों तक पहुंच सकता है, लेकिन यह या तो काम नहीं करता है (जिसका अर्थ है, मैं को छोड़कर किसी भी तरीकों उपयोग नहीं कर सकते Object-संबंधित तरीकों के लिए)।

मान लें कि, मेरे उपयोग के मामले में मैं इन सभी वस्तुओं के इंटरफेस का निरीक्षण करना चाहता हूं जो मैं फिर से पहचानता हूं और पता लगाए गए इंटरफ़ेस के अनुसार कार्य करता हूं। आइए यह भी मान लें कि मेरे पास विभिन्न वर्गों की दर्जनों वस्तुएं हो सकती हैं और उनमें से सभी तीन इंटरफेस में से एक को लागू करती हैं।

एकमात्र समाधान जो मैं सोच सकता हूं वह है कि मैं अपने कोड को दर्जनों isinstance चेक के साथ भरना चाहता हूं, लेकिन मैं कम बोझिल दृष्टिकोण पसंद करूंगा (यानी जांच कर रहा हूं कि किसी दिए गए ऑब्जेक्ट में तीन इंटरफेस लागू होते हैं)।

+0

में डालने के लिए जा रहा है आप एक है है "कम बोझिल दृष्टिकोण" का विचार आप कल्पना कर रहे हैं? मेरा मतलब है कि यदि आपके पास कोड के तीन अलग-अलग टुकड़े हैं, तो आप तीन अलग-अलग इंटरफेस में से एक को लागू करते हैं या नहीं, ऐसा लगता है कि हम जो भी दृष्टिकोण सुझा सकते हैं, उसे तीन अलग-अलग शाखाएं मिलनी होंगी। तो यह स्पष्ट होगा कि आपको बोझिल लगने पर क्या स्पष्टता मिल रही है। –

+0

क्षमा करें, शायद मैं पर्याप्त स्पष्ट नहीं था। मैं "कम से कम तीन इंटरफेस में से एक को लागू करता है" जांचने पर विचार करता हूं "कम बोझिल होने के लिए दृष्टिकोण। कम से कम जब "if" कथन के दर्जनों के साथ परिदृश्य की तुलना में। –

+0

मुझे यकीन नहीं है कि अगर हम दर्जनों से बयान देते हैं तो हम 3 से कहाँ जा रहे हैं ... मेरा जवाब 3 अगर बयानों का उपयोग करेगा, तो क्या आप यही खोज रहे हैं? एक बार में तीन इंटरफेस की जांच के साथ समस्या यह है कि आप जा रहे हैं तो फिर से कुछ अलग-अलग इंटरफ़ेस के आधार पर कुछ अलग करने की आवश्यकता है, तो यह आपको क्या प्राप्त करता है? –

उत्तर

5

प्रत्येक प्रविष्टि पर एक विशिष्ट विधि को कॉल करने का प्रयास करके, आप मूल रूप से कह रहे हैं कि आप कंपाइलर से बेहतर जानते हैं, और आप जानते हैं कि प्रत्येक प्रविष्टि में एक विशिष्ट सुपर क्लास है।

तो आप जानते हैं कि बात है तो आपको Class#asSubclass का उपयोग klassClass<? extends KnownSuper> के रूप में टाइप करने के लिए कर सकते हैं ताकि getFavorite तो KnownSuper का एक उपवर्ग वापस आ जाएगी (और इसलिए विधि का पर्दाफाश):

Class<KnownSuper> superClass = KnownSuper.class; //class with callMethod() 
for (Class<?> klass : f.keySet()) { 
    f.getFavorite(klass.asSubClass(superClass)).callMethod() 
} 

बहरहाल, यह स्पष्ट रूप से होगा यदि कोई प्रमुख वर्ग KnownSuper का विस्तार नहीं करता है तो रनटाइम अपवाद दें। तो यदि उपर्युक्त सुरक्षित होगा, तो आपको पहले स्थान पर KnownSuper से बढ़ने वाली प्रमुख कक्षाओं को स्वीकार करने के लिए अपने विषम कंटेनर को पैरामीटर बनाना चाहिए।

यदि नहीं सभी प्रविष्टियों इस प्रकार के हो जाएगा, तो आप भी पहले की जांच कर सकता है, तो कुंजी उपयुक्त है जब पुनरावृत्ति:

Class<KnownSuper> superClass = KnownSuper.class; //class with callMethod() 
for (Class<?> klass : f.keySet()) { 
    if (superClass.isAssignableFrom(klass)) { 
     f.getFavorite(klass.asSubClass(superClass)).callMethod() 
    } 
} 
0

बस इस सरल उदाहरण

कहो आप के माध्यम से जाना नीचे पसंदीदा वर्ग परिभाषा

public class Favorites extends HashMap<String, String> { 

} 

यहाँ परीक्षण वर्ग

public class TestGeneric { 

    public static void main(String[] args) { 

     Favorites f = new Favorites(); 
     f.put("test", "test"); 

     for (String test1 : f.keySet()) { 

      f.get("").charAt(index)// you will see all string specific method as compiler knows in advance what object map going to contain 


    } 

} 

पल आप बदलना Favorites extends HashMap<String, String>Favorites extends HashMap को आप न केवल विशिष्ट तरीकों वस्तु के रूप में संकलक पहले से पता नहीं है जो पसंदीदा वस्तु नक्शा

+1

** हेटरोजेनस ** कंटेनर का उपयोग करने का बिंदु ** विषम ** वस्तुओं को इसमें डालने में सक्षम होना है। उदाहरण के लिए: 'f.putFavorite (स्ट्रिंग.क्लास, "जावा"); f.putFavorite (Integer.class, 1); '। –

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