2015-06-19 10 views
6

मैं एक सामान्य प्रकार के लिए निम्नलिखित हस्ताक्षर के साथ एक स्थिर कार्य हो T(संकलन समय त्रुटि) जावा में एक सामान्य प्रकार से एक सामान्य प्रकार का निष्कर्ष निकालते

public static<T> List<T> sortMap(Map<T, Comparable> map) 

जो कुछ संपत्ति के साथ नक्शा कुंजी की एक सूची प्रदान करना चाहिए ।

अब मैं एक सामान्य वर्ग के भीतर स्थिर समारोह है, जो एक सदस्य चर के रूप में नक्शा है बुला में टाइप S

Map<S,Double> map 

की एक सामान्य HashMap पास करना चाहते हैं।

मैंने नीचे एक न्यूनतम कोड उदाहरण सूचीबद्ध किया है।

required: Map<T#1,Comparable> 
    found: Map<T#2,Double> 
    reason: cannot infer type-variable(s) T#1 
    (argument mismatch; Map<T#2,Double> cannot be converted to Map<T#1,Comparable>) 

कैसे इस समस्या को हल कर सकते हैं:

हालांकि, मैं एक त्रुटि संदेश (S और T दोनों टी के हैं, लेकिन मेरे कोड के अलग-अलग दायरों में है, यानी T#1 = T, T#2 = S) मिल सकता है? मुझे हैरान है कि जावा एक सामान्य प्रकार से जेनेरिक प्रकार को घुमाने की अनुमति नहीं देता है। जावा में कौन सी संरचना उस तरह के अधिक अमूर्त कोड तर्क के साथ काम करने के लिए उपयोग कर सकती है?

कोड:

public class ExampleClass<T> { 
    Map<T, Double> map; 
    public ExampleClass() { 
     this.map = new HashMap(); 
    } 
    //the following line produces the mentioned error 
    List<T> sortedMapKeys = UtilityMethods.sortMap(map); 
} 

public class UtilityMethods { 
    public static<T> List<T> sortMap(Map<T, Comparable> map) { 
     // sort the map in some way and return the list 
    } 
} 
+0

कृपया वर्ग कोड दर्शकों को दिखाने:

public static <T, S extends Comparable<S>> List<T> function(Map<T, S> map) { //implementation } 

उसके बाद, आप के साथ विधि आह्वान करने के लिए सक्षम हो जाएगा। –

+0

'स्थिर 'विधियां सदस्य चर का उपयोग नहीं कर सकती हैं; और जावा का आप किस संस्करण का उपयोग करते हैं? –

+0

मुझे लगता है कि आपको समस्या को समझने के लिए हमें कुछ और कोड जोड़ना होगा। –

उत्तर

7

यह T और S के साथ समस्या नहीं है, लेकिन Comparable और Double साथ।

त्रुटि का कारण यह है कि Map<T, Double> is not a Map<T, Comparable>

आपको दूसरे प्रकार-पैरामीटर के दायरे को थोड़ा विस्तार करना होगा। की तरह कुछ:

Map<S, Double> map = new HashMap<S, Double>(); 
function(map); 
+0

इसे [variance] कहा जाता है (https://msdn.microsoft.com/en-US/library/ee207183.aspx) –

+0

धन्यवाद! मुझे जेनेरिक प्रकारों पर केंद्रित संकलक संदेश द्वारा गुमराह किया गया था। साथ ही, मैंने सोचा कि संकलक समझ जाएगा कि 'डबल' 'तुलनात्मक' है और जेनेरिक के लिए वर्ग विरासत से अलग इंटरफेस को अलग-अलग संभाला जाएगा। मुझे अभी भी लगता है कि जेनेरिक में 'विस्तारित' कीवर्ड का उपयोग करने के जावा तर्क का वर्णन करने के लिए कि मैं एक प्रकार 'S'that * उपकरण * और इंटरफ़ेस की अपेक्षा करता हूं। क्या मुझे यहाँ कुछ याद आती है? क्या यह जेनेरिक के साथ * विस्तार और इंटरफ़ेस * को समझ में आता है? – madison54

+0

हां, जेनिक्स में 'विस्तार' दोनों कक्षाओं और इंटरफेस के लिए प्रयोग किया जाता है। सर्वोत्तम परिणामों के लिए –

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