2012-07-16 11 views
8

मेरे पास Map है जिनकी चाबियाँ सामान्य प्रकार Key<T> हैं, और मान List<T> प्रकार हैं। यदि कुंजी Key<String> का उदाहरण है, तो मान List<String> होना चाहिए, और एक ही नियम किसी अन्य कुंजी-मूल्य जोड़े पर लागू होता है। मैं निम्नलिखित की कोशिश की है, लेकिन यह संकलन नहीं करता है:परिवर्तनीय जेनेरिक के साथ एक नक्शा कैसे घोषित करें?

Map<Object, List> map; 

मैं जानता हूँ कि यह बुरा है, लेकिन मैं वर्तमान में कोई बेहतर विकल्प है:

Map<T, List<T>> map; 

वर्तमान में मैं "आंशिक" जेनरिक के साथ यह घोषणा करने के लिए है । क्या इस स्थिति में जेनेरिक का उपयोग करना संभव है?

अद्यतन

शायद मैं मेरी समस्या स्पष्ट रूप से व्यक्त नहीं किया।

map.put(new Key<String>(), new ArrayList<String>()); 
map.put(new Key<Integer>(), new ArrayList<Integer>()); 

और निम्नलिखित कोड संकलन नहीं करना चाहिए:: मैं एक नक्शा है कि करने में सक्षम है चाहता हूँ

map.put(new Key<String>(), new ArrayList<Integer>()); 

कुंजी और मान हमेशा एक ही सामान्य प्रकार होना चाहिए सामान्य प्रकार कोई भी हो सकता है, जबकि, और स्पष्ट रूप से एक मानचित्र का विस्तार मेरी आवश्यकता को पूरा नहीं करता है।

+0

स्थान समस्या नहीं होनी चाहिए। यह संभवतः जिस तरह से उपयोग किया जाता है। ओपी को ठीक करने के लिए और कोड दिखाने की जरूरत है। – Nishant

+0

क्या आप 'टी' टाइप की कुंजी, या' कुंजी 'प्रकार की कुंजी का उपयोग कर रहे हैं? –

+0

अपने वास्तविक परिदृश्य के साथ, आपको अपनी समस्या को हल करने के लिए encapsulation का उपयोग करना चाहिए क्योंकि निशांत और जियोफ उनके उत्तरों में बताते हैं, बस इसे अपने वास्तविक कोड में अनुकूलित करें। –

उत्तर

7

मुझे किसी मौजूदा पुस्तकालय से अवगत नहीं है जो ठीक है लेकिन यह स्वयं को लागू करना बहुत कठिन नहीं है। मैंने अतीत में कुछ बार ऐसा कुछ किया है। आप मानक मानचित्र इंटरफ़ेस का उपयोग नहीं कर सकते हैं लेकिन आप अपनी कक्षा को लागू करने के लिए अंदर हैश मानचित्र का उपयोग कर सकते हैं। शुरू करने के लिए, ऐसा कुछ ऐसा दिखाई दे सकता है:

public class KeyMap { 
    public static class Key<T> { } 

    private final HashMap<Object,List<?>> values = new HashMap<Object,List<?>>(); 

    public <T> void put(Key<T> k, List<T> v) { 
    values.put(k, v); 
    } 

    public <T> List<T> get(Key<T> k) { 
    return (List<T>)values.get(k); 
    } 

    public static void main(String[] args) { 
    KeyMap a = new KeyMap(); 
    a.put(new Key<String>(), new ArrayList<String>()); 
    a.get(new Key<Integer>()); 
    } 
} 
+0

आप वास्तव में मेरे 'मानचित्र > मानचित्र' को किसी अन्य वर्ग में लपेट रहे हैं।ऐसा लगता है कि एक साधारण नक्शा मेरी आवश्यकता को पूरा नहीं कर सकता है, इसलिए यह आखिरी विकल्प हो सकता है। धन्यवाद! –

4

यह तुम क्या चाहते है:

public class Test<T> extends HashMap<T, List<T>> 
{ 
} 

आप सुपर वर्ग के रूप में एक HashMap नहीं करना चाहते हैं तो यह जो कुछ भी ठोस वर्ग आप चाहते करने के लिए बदल जाते हैं।

+0

कृपया मेरा अपडेट देखें। –

+0

मैंने अपना जवाब बदल दिया है। – Brad

+0

लेकिन मैं अपने डेटा को स्टोर करने के लिए केवल एक 'टेस्ट' उदाहरण का उपयोग कैसे कर सकता हूं? –