यह नियम विरासत कोड में संघर्ष से बचने के लिए है जो अभी भी कच्चे प्रकार का उपयोग करता है।
यहाँ एक दृष्टांत दिया गया है कि यह अनुमति क्यों नहीं दी गई, जेएलएस से खींची गई। मान लीजिए, जेनेरिक को जावा में पेश किए जाने से पहले, मैंने कुछ कोड इस तरह लिखे:
class CollectionConverter {
List toList(Collection c) {...}
}
आप इस तरह मेरी कक्षा का विस्तार करें:
class Overrider extends CollectionConverter{
List toList(Collection c) {...}
}
जेनरिक की शुरुआत के बाद, मैंने अपनी लाइब्रेरी को अपडेट करने का फैसला किया।
class CollectionConverter {
<T> List<T> toList(Collection<T> c) {...}
}
आप कोई भी अपडेट करने के लिए तैयार नहीं हैं, इसलिए आप अपनी Overrider
कक्षा को अकेले छोड़ देते हैं। ठीक से ओवरराइड करने के लिएtoList()
विधि , भाषा डिजाइनरों ने फैसला किया कि एक कच्चा प्रकार किसी भी उत्पन्न प्रकार के लिए "ओवरराइड-समतुल्य" था। इसका मतलब यह है कि यद्यपि आपकी विधि हस्ताक्षर अब औपचारिक रूप से मेरे सुपरक्लास हस्ताक्षर के बराबर नहीं है, फिर भी आपकी विधि ओवरराइड होती है।
अब, समय बीतता है और आप तय करते हैं कि आप अपनी कक्षा को अपडेट करने के लिए तैयार हैं। लेकिन आप थोड़ा पेंच करते हैं, और मौजूदा, कच्ची toList()
विधि को संपादित करने के बजाय , आप इस तरह एक नई विधि जोड़ते हैं :
class Overrider extends CollectionConverter {
@Override
List toList(Collection c) {...}
@Override
<T> List<T> toList(Collection<T> c) {...}
}
कच्चे प्रकार के ओवरराइड तुल्यता के कारण, toList(Collection<T>)
विधि को ओवरराइड करने के लिए दोनों विधियां एक वैध रूप में हैं । लेकिन निश्चित रूप से, कंपाइलर को एकल विधि को हल करने की आवश्यकता है। इस अस्पष्टता को खत्म करने के लिए, वर्गों को कई तरीकों की अनुमति नहीं है जो कि ओवरराइड-समतुल्य हैं - अर्थात्, एक ही पैरामीटर प्रकारों के साथ कई विधियाँ इरेज़र के बाद होती हैं।
कुंजी यह है कि यह एक भाषा नियम है जिसे कच्चे प्रकारों का उपयोग करके पुराने कोड के साथ संगतता बनाए रखने के लिए डिज़ाइन किया गया है। यह किसी प्रकार के मापदंडों के उन्मूलन के लिए आवश्यक सीमा नहीं है; क्योंकि विधि-निर्धारण संकलन-समय पर होता है, इसलिए विधि पहचानकर्ता के लिए सामान्य प्रकार जोड़ना पर्याप्त होता।