2012-09-18 16 views
6

संभव डुप्लिकेट:
@SuppressWarnings for “extends String”क्यों 'टी स्ट्रिंग को बढ़ाता है' की अनुमति है लेकिन चेतावनी देता है?

क्यों T extends String अनुमति लेकिन चेतावनी देता है?

टाइप पैरामीटर टी को अंतिम प्रकार स्ट्रिंग द्वारा बाध्य नहीं किया जाना चाहिए। अंतिम प्रकार आगे

public class Car<T extends String> 

मैं क्या अंतिम मैं जानता हूँ कि यह वैध है क्योंकि T can be String का एकमात्र संभावित मूल्य मैं चेतावनी के बारे में सोच रहा था है पता नहीं बढ़ाई जा सकती।

+2

चेतावनी संदेश सब कुछ कहता है। आप एक कक्षा के साथ कैसे आ सकते हैं जो 'अंतिम' स्ट्रिंग को बढ़ाता है? तो 'टी' निश्चित रूप से 'स्ट्रिंग' – Raffaele

+0

@ थोर 84no संपादित प्रश्न और [एक्स्टाव] (http://stackoverflow.com/a/12475147/315306) का उत्तर – Raffaele

उत्तर

13

यदि वास्तविक प्रश्न "इसकी अनुमति क्यों है" है, तो एक स्थिति की कल्पना करें जब आप मौजूदा कक्षा में final कीवर्ड जोड़ते हैं। मुझे लगता है कि आप नहीं चाहते कि यह बदलाव अन्य मौजूदा कोड को तोड़ने के लिए जो इस वर्ग का उपयोग सामान्य बाध्य के रूप में करता है, क्योंकि यह अभी भी पूरी तरह से कानूनी है। यही कारण है कि संकलक इस मामले में एक त्रुटि उत्सर्जित नहीं करता है।

दूसरी ओर से, यदि आप गोपनीय रूप से final कक्षा को सामान्य बाध्य के रूप में उपयोग करते हैं, तो आप सूचित होना चाहते हैं, क्योंकि ऐसी संरचना का कोई मतलब नहीं है। यही कारण है कि संकलक एक चेतावनी उत्सर्जित करता है।

दरअसल, चेतावनियों के साथ कानूनी लेकिन अर्थहीन संरचनाओं को चिह्नित करने के लिए यह एक आम प्रथा है।

1

क्योंकि जावा में String अंतिम है, i। ई। आप उस वर्ग का विस्तार नहीं कर सकते हैं। तो आपके पास चेतावनी है क्योंकि स्ट्रिंग को विस्तारित करने वाली कक्षा मौजूद नहीं हो सकती है।

+2

ओपी पूछ रहा है कि ऐसा करने की अनुमति क्यों है ? –

3

असल में, यह कह रहा है कि T के लिए केवल एक संभव प्रकार है और यह String है। तो मूल रूप से आपकी जेनेरिक Car कक्षा केवल नाम में सामान्य है। आप String के साथ कक्षा में T के सभी उदाहरणों को भी प्रतिस्थापित कर सकते हैं।

शायद आप public class Car<T extends CharSequence> मतलब ... क्योंकि वर्ग सार्थक, और संभवतः भी उपयोगी है


निर्माण अनुमति दी है। चेतावनी दी जाती है क्योंकि (कंपाइलर लेखकों की राय में) आपने शायद गलती की है। तर्क चेतावनी है कि कुछ compilers निम्नलिखित के लिए आप दे देंगे के लिए के रूप में ही है:

String NULL = null; 
System.err.println(NULL.toString()); 

यह सार्थक है, लेकिन यह एक गलती है ... जब तक आप इरादा यह एक अपवाद फेंकने के लिए।


मैं दो स्थितियों के बारे में सोच सकते हैं, जहां public class Car<T extends SomeFinalClass> एक गलती नहीं है:

  • मामले में जहां SomeFinalClass मूल रूप final नहीं था।
  • वह मामला जहां Car के लिए कोड स्वचालित रूप से जेनरेट किया गया है, और यह final कक्षाओं के लिए विशेष-केस कोड उत्पन्न करने के लिए अजीब होगा।
संबंधित मुद्दे

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