2011-10-14 11 views
11

चलिए निम्न श्रेणी पदानुक्रम रखते हैं:जावा जेनेरिक बग?

public class MyType { 
} 

public class MySuperclass<T extends MyType> { 
    protected Map<String, String> myMap = new TreeMap<String, String>(); 
    protected String myMethod(String s) { 
     return myMap.get(s); 
    } 
} 

public class MySubclass extends MySuperclass { 
    @Override 
    protected String myMethod(String s) { 
     return myMap.get(s); // <-- compilation error 
    } 
} 

MySubclass की अतिप्रवाह विधि में संकलन त्रुटि क्यों है? त्रुटि संदेश "मिस्चैच टाइप करें: ऑब्जेक्ट से स्ट्रिंग में कनवर्ट नहीं किया जा सकता"।

दिलचस्प बात यह है कि संकलन त्रुटि गायब हो जाती है अगर मैं MySuperclass परिभाषा में MySuperclass के लिए जेनेरिक वर्ग प्रकार को परिभाषित करता हूं:

public class MySubclass extends MySuperclass<MyType> { 
    @Override 
    protected String myMethod(String s) { 
     return myMap.get(s); 
    } 
} 

क्या कोई इस व्यवहार को समझा सकता है? मैं इसे जावा कंपाइलर बग मानता हूं।

मैं jdk1.6.0_24 का उपयोग कर रहा हूं।

उत्तर

12

यह एक बग नहीं है। के बजाय MySuperclass का विस्तार करके, आप कच्चे प्रकारMySuperclass का विस्तार कर रहे हैं, जिसका अर्थ है कि myMapMap<String, String> के बजाय Map प्रकार भी होगा।

+1

बिल्कुल। वह ब्लोच के "गूढ़ व्यक्ति" में से एक था। – Bozho

+0

तो जेनेरिक सब कुछ या कुछ भी नहीं है? यदि आप कच्चे प्रकार का उपयोग करते हैं, तो आपको उस प्रकार के लिए कोई जेनरिक नहीं मिलेगा, न कि उन हिस्सों को भी जो टी 'टी' पर निर्भर नहीं हैं? – Thilo

+2

लेकिन 'MySuperclass ** ** की सामान्य परिभाषा क्या है, 'मैप ** <स्ट्रिंग, स्ट्रिंग> ** myMap' के जेनेरिक के साथ आम है? वे दो अलग जेनरिक परिभाषाएं हैं जिनमें उनके बीच 'कनेक्शन' नहीं है। मुझे यह नहीं मिला। –

0

अगर फू बार की एक उप-प्रकार (उपवर्ग या subinterface) है, और जी कुछ सामान्य प्रकार घोषणा है, यह मामला है कि जी जी

की एक उप-प्रकार आप http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf (के लिए उल्लेख कर सकते हैं नहीं है अधिक जानकारी)

1

यह वास्तव में अनुचित है। इसे डिजाइन में एक बग माना जा सकता है। मूल कारण पुराना एक बरकरार रखने और नए जेनरेटेड एपीआई को पेश करने के बजाय जेनरेटेड संग्रह एपीआई पिछड़ा संगत रखने का निर्णय है। यह निर्णय तकनीकी रूप से बकवास है, और उनकी व्याख्याएं हंसमुख हैं। इसके पीछे असली कारण शायद सूर्य को जावा 5 को धक्का देने के लिए मजबूर किया गया था लेकिन पर्याप्त संसाधन नहीं था, इसलिए उन्होंने आसान मार्ग (मिटा) लिया। तो यहां हम पूरी तरह से खराब हैं। यह बेस्टर्ड टाइप सिस्टम न केवल एक समस्या है, यह किसी भी नई सुविधा को पेश करने में भी एक बड़ी बाधा है।

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