2016-09-03 21 views
24

मुझे पता है के रूप में बिना एक सूची को सौंप दिया जाता है, जावा में जेनरिक के मुख्य उद्देश्यों में से एक प्रदान कर रहा है संकलन-समय प्रकार सुरक्षा। यदि यह संकलित हो जाता है, तो कोड बिना किसी समस्या के चलाएगा।स्ट्रिंग एक संकलन त्रुटि

तो फिर निम्नलिखित कोड संकलित किया जा रहा है?

public static void main(String[] args) { 
    String s = getList(); 
} 

private static <T extends List> T getList() { 
    return (T)new ArrayList(); 
} 

यह ठीक संकलित करता है। मेरा प्रकार-सुरक्षित संकलन कहां है? getList() विधि में String कक्षा के साथ कुछ भी सामान्य नहीं है।

+1

नहीं, यह गैर-कच्चे प्रकारों का उपयोग करते समय भी संकलित करता है। –

+0

@MarkusFischer, मैं भी इस बारे में विचार है, लेकिन संकलक पता चलता है कि स्ट्रिंग एक अंतिम वर्ग है और किसी भी उपवर्गों – Andrew

+1

@MarkusFischer नहीं हो सकता है, तो आप एक जवाब के लिए इस टिप्पणी को बदलने चाहिए। मुझे लगता है कि यह बिल्कुल सही मुद्दा है। 'MyClass स्ट्रिंग इम्प्लेमेंट्स सूची बढ़ाता है' संकलन समय पर संभव हो सकता है क्योंकि संकलक स्ट्रिंग को 'अंतिम' मानते नहीं हैं, जैसा आपने कहा था, जेनेरिक-चेक के लिए। – Zabuza

उत्तर

13

यह एक प्रकार विलोपन समस्या से प्रति, लेकिन लगभग विपरीत नहीं है: जब सिस्टम वास्तविक प्रकार जानता है आप क्रम में एक समस्या हो,, लेकिन संकलन समय पर नहीं। इस संकलन का कारण यह है कि List एक इंटरफ़ेस है। जहां तक ​​संकलक का संबंध है, String का एक उपवर्ग वास्तव में उस इंटरफ़ेस को लागू सकता है, इसलिए संकलक कारण है कि वैध क्रम स्थितियों हो सकता है, जहां वास्तविक वस्तु लौटे एक String भी एक List है। संकलक इस बात पर विचार नहीं करता है कि स्ट्रिंग अंतिम है, और इस प्रकार वास्तव में List बनाने के लिए असंभव है-String कक्षा को कार्यान्वित करना असंभव है।

क्यों अंतिम संकलन के दौरान नहीं माना जाता है के रूप में, सवाल का बोहेमियन की टिप्पणी एक अच्छा विवरण देता है।

+0

कम से कम एक संकलक चेतावनी नहीं होना चाहिए? मैंने खुद जावैक की जांच नहीं की है, लेकिन मेरा आईडीई किसी भी चीज के बारे में चेतावनी नहीं देता है, लेकिन एक अनचेक कास्ट और कच्चे प्रकार। मैं उन उदाहरणों का काम कर सकता हूं जहां कच्चे प्रकार नहीं हैं और जहां कोई चेतावनी नहीं है, लेकिन जहां प्रकार स्पष्ट रूप से सही नहीं है। – RudolphEst

+0

मैं मानता हूं कि एक कंपाइलर चेतावनी अच्छी होगी और इस स्थिति के लिए समझ में आ जाएगी। मैं जवाक से न देखता हूं और न ही ग्रहण करता हूं। फिर, यह संकलन करता है कि कंपाइलर कितने किनारे के मामलों की जांच करता है, और जाहिर है कि इस नक्षत्र की जांच न करने का निर्णय लिया गया था। –

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