2011-11-18 11 views
8

मेरी कक्षा में से एक को कक्षाओं को अपने सुपरक्लास के अनुसार स्टोर करने की आवश्यकता है। इसके लिए, मैं एक हैश मैप का उपयोग कर रहा हूं, जहां चाबियाँ सुपरक्लास हैं, और उनके विस्तारित वर्गों की एक सूची मानती हैं। तो यह है कि जैसा दिखता है:हैश मैप <Class<?>, सूची <Class<?> >> निर्दिष्ट करें कि सूचियां 'कक्षाएं कुंजी का विस्तार करती हैं'

HashMap<Class<?>, List<Class<?>>> 

मैं अगर वहाँ एक अंकन मुझे और अधिक सटीक होना करने के लिए अनुमति देता है, की तरह कुछ था जानना चाहते हैं:

HashMap<Class<T>, List<Class<? extends T>>> 

मुझे लगता है कि कोशिश की है और निश्चित रूप से, , यह काम नहीं करता है: टी को हल नहीं किया जा सकता है। क्या कोई वाक्यविन्यास है जो मुझे ऐसा करने की अनुमति देगा? आपकी सहायता के लिये पहले से ही धन्यवाद।

उत्तर

8

आप एक्सेसर विधियों के साथ ऐसा कर सकते हैं।

// only accessed by methods which check the keys and values are the right type. 
final Map<Class, List<Class>> map = new LinkedHashMap<Class, List<Class>>(); 

public <T, S extends T> void add(Class<T> key, Class<S> value) { 
    List<Class> list = map.get(key); 
    if (list == null) 
     map.put(key, list = new ArrayList<Class>()); 
    list.add(value); 
} 

public <T, S extends T> List<Class<S>>get(Class<T> key) { 
    return (List<Class<S>>) map.get(key); 
} 

public <T, S extends T> boolean contains(Class<T> key, Class<S> value) { 
    List<Class> list = map.get(key); 
    if (list == null) return false; 
    return list.contains(value); 
} 

public static void main(String... args) { 
    Main m = new Main(); 
    m.add(Number.class, Integer.class); // compiles 
    m.add(Number.class, String.class); // does not compile. 
} 
+2

+1। ध्यान दें कि m.add (Number.class, Number.class); संकलन भी। –

+0

आप सही हैं, 'विस्तार' को इस संदर्भ में सख्त उप-वर्ग नहीं होना चाहिए। –

+0

और आप चीजों को करने के तरीके से गेटर्स को कैसे कोड करेंगे? – Raveline

1

कुछ की तरह:

class MyMap<T extends Class<?>> extends HashMap<T, List<T>> { 

} 

पूरी तरह से आपकी समस्या का समाधान नहीं होगा। आप देख सकते हैं कि मानचित्र में एकल प्रविष्टियों पर यह भिन्न नहीं हो सकता है।

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