2009-07-30 18 views
7

अगर मैं अब एक ढेर वर्गजावा कच्चे प्रकार और जेनरिक बातचीत

class Stack<E> {} 

अगर मैं करता हूँ:

1) Stack<Integer> s = new Stack()

2) Stack s = new Stack<Integer>()

3) Stack s = new Stack()

क्या कोई मुझे बता सकता है कि इन इंटरैक्शन (जेनर आईसी < -> कच्चे) कारण?

मुख्य रूप से मेरी संदेह बिंदु 1. वास्तव में पर है अगर मैं करता हूँ कि काम यह असुरक्षित है, क्योंकि है कि ढेर अन्य प्रकार तो स्टोर कर सकते हैं पूर्णांक। हाँ लेकिन की दुकान करता है, तो मैं एक धक्का विधि है और प्रयास करने के लिए एक मूल्य की तुलना में एक पूर्णांक othern संकलक मुझे रोक ... इसलिए जब मुझे लगता है कि असुरक्षित आपरेशन होगा?

+0

मैं इसे नहीं मिलता है - आप एक ढेर है जहाँ आप अन्य बातों के तो पूर्णांकों (जैसे पूर्णांकों और डबल्स) धक्का कर सकते हैं करना चाहते हैं या आप केवल एक ही प्रकार (पूर्णांक) के साथ ढेर उपयोग करना चाहते हैं करते हैं और संकलक जाने आपकी मदद? –

+1

नहीं, मैं एक प्रकार के साथ एक ढेर चाहते हैं और जानना चाहते हैं कि मैं कि कार्य कर क्या होगा चाहते हैं। – xdevel2000

उत्तर

6

उनमें से सभी असुरक्षित हैं क्योंकि type erasure के आधार पर जावा जेनेरिक, केवल वाक्य रचनात्मक चीनी हैं।

Stack<Integer> s = new Stack<Integer>(); 
Stack<Double> s2 = (Stack<Double>)s; 
s2.push(3.3d); 

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

वे अभी भी उपयोगी होते हैं और अपने कोड और अधिक पठनीय और त्रुटि-रहित होता है लेकिन अंत में, एक बाइट कोड के स्तर पर, यह महत्वपूर्ण समझने के लिए वे कुछ भी नहीं कर रहे हैं कर सकते हैं।

+0

ओपी का मामला नहीं # 2 है जहां संकलक एस के लिए सामान्य प्रकार के तर्कों का अनुमान लगाने के लिए पर्याप्त स्मार्ट है? –

+0

हां लेकिन बिंदु 1 में संकलक मुझे सलाह देता है कि अगर मैं एक इंटीजर के अलावा किसी ऑब्जेक्ट को (पुश ऑपरेशन के साथ) डालने का प्रयास करता हूं। तो जेनेरिक न केवल 'सिंटेक्टिक चीनी' हो सकते हैं लेकिन बिंदु 1 में संकलक के व्यवहार (अर्थात्) भी बदलते हैं। तो फिर मुझे समझ में नहीं आता कि असुरक्षित कहां है ... कृपया, कृपया मुझे एक और विश्लेषणात्मक व्याख्या दें? – xdevel2000

7

सभी तीन पूरी तरह कानूनी हैं, क्योंकि Stack और Stack<Integer> के बीच कोई वास्तविक रनटाइम अंतर नहीं है, लेकिन इन तीनों के परिणामस्वरूप कंपाइलर चेतावनियां होंगी।

Stack<Integer> s = new Stack() 

यह एक "अनियंत्रित रूपांतरण" चेतावनी में परिणाम होगा, क्योंकि यह एक पैरामिट्रीकृत प्रकार के एक कच्चे प्रकार परिवर्तित करने के लिए सामान्य रूप में सुरक्षित नहीं है। हालांकि, इस मामले में ऐसा करने के लिए पूरी तरह से सुरक्षित है: Integer मानों को धक्का देने से कोई त्रुटि नहीं आएगी; गैर-Integer मानों को धक्का देना एक प्रकार की त्रुटि का कारण बन जाएगा।

Stack s = new Stack<Integer>() 

यह एक पैरामीटर प्रकार से कच्चे प्रकार के लिए एक कानूनी रूपांतरण है। आप किसी भी प्रकार के मूल्य को धक्का दे पाएंगे। हालांकि, इस तरह के किसी भी ऑपरेशन के परिणामस्वरूप "अनचेक कॉल" चेतावनी होगी।

Stack s = new Stack() 

फिर से, यह कानूनी है, कोई अंतर्निहित रूपांतरण नहीं है। आप किसी भी प्रकार के मूल्य को धक्का दे पाएंगे। हालांकि, इस तरह के किसी भी ऑपरेशन के परिणामस्वरूप "अनचेक कॉल" चेतावनी होगी।

तुम भी एक "कच्चे प्रकार" किसी भी समय आप प्रकार Stack का उल्लेख चेतावनी मिल सकता है।

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