2015-03-26 10 views
5

से कच्चे प्रकार का कच्चा प्रकार कैसे जावा जेनेरिक संदर्भ में, कच्चा प्रकार एक सामान्य प्रकार का एक गैर-पैरामीटरयुक्त आमंत्रण है। वे यह भी कहते हैं कि कोई गैर-जेनेरिक प्रकार कच्चा प्रकार नहीं है।जावा जेनरिक - गैर जेनेरिक प्रकार

मेरा भ्रम है, क्यों वे कहते हैं कि गैर-सामान्य प्रकार कच्चा प्रकार नहीं है? यह एक सामान्य प्रकार के गैर-पैरामीटरयुक्त आमंत्रण से अलग कैसे है। निम्नलिखित 2 मामलों पर विचार करें।

केस 1:

class A<T>{ 

} 
A a = new A(); //Raw type 

केस 2:

class A{ 

} 
A a = new A();//Non-generic type 

तो चर "एक" हूबहू दोनों ही मामलों में व्यवहार करती है, इसलिए वे कहते हैं मामले [1] कच्चे प्रकार है, जबकि मामले [2 ] नहीं है?

+0

व्यवहारिक रूप से यह मूल रूप से वही है। अर्थात् यह बहुत अलग है। –

+0

आप http://stackoverflow.com/questions/2770321/what-is-a-raw-type-and-why-shouldnt-we-use-it –

+0

@Ortomala Lokni उस लिंक के लिए धन्यवाद पढ़ सकते हैं। यह कहता है "अनिवार्य रूप से, कच्चे प्रकार व्यवहार करते हैं जैसे वे जेनेरिक पेश किए जाने से पहले थे" जो शायद मुझे बताता है कि मेरा चर "ए" दोनों मामलों में बिल्कुल वही व्यवहार करेगा। यदि यह सही है, तो कृपया इस प्रश्न का उत्तर दें। मैं इसे स्वीकार करूंगा। लेकिन मुझे अभी भी उस मामले में आश्चर्य है कि वे क्यों कहते हैं कि एक गैर-जेनेरिक एक रॉ प्रकार नहीं है? यह कहने में क्या गलत है कि सभी गैर-जेनेरिक प्रकार भी रॉ प्रकार हैं? –

उत्तर

4

कच्चे प्रकार की अवधारणा केवल सामान्य प्रकार के लिए प्रासंगिक है क्योंकि कच्चे प्रकार को असाइनमेंट माना जाता है-सामान्य प्रकार के साथ संगत, लेकिन इस तरह के असाइनमेंट में टाइपिंग सुरक्षा में एक छेड़छाड़ खुलती है अन्यथा जेनेरिक के लिए गारंटी प्रकार। उदाहरण के लिए, एक विधि void workWith(A<Integer> a) पर विचार करें। आपको अपने a चर में प्रवेश करने की अनुमति होगी, जिसके परिणामस्वरूप एक प्रकार की सुरक्षा घटना होगी।

गैर-सामान्य प्रकार ऐसे मुद्दों से पीड़ित नहीं हो सकते हैं, उन्हें "कच्चे प्रकार" नहीं कहा जाता है।

+0

@ सुरेश कुमारमारवी: ठीक है, कच्चे प्रकारों का उपयोग आपको चेतावनी देता है, जबकि उपयोग गैर-सामान्य प्रकार के नहीं। – newacct

1

रूप JLS में कहा:

A non-generic class or interface type is not a raw type.

आप वाक्यात्मकस्तर में अंतर महसूस कर सकते हैं:

class A<X> { 
    class B<Y> { 
     Y y; 
    } 
} 
तो

सिर्फ A:

हम पैरामिट्रीकृत वर्ग है, तो नाम का प्रकार या B नाम प्रकार non-generic प्रकार नहीं हैं, वे raw प्रकार के होते हैं, और आप उन्हें कैसे करने के लिए उपयोग कर सकते हैं पर इस को प्रभावित करती है:

A<Integer>.B ab = null; 
A.B<Integer> ab = null; 
+0

मैं सहमत हूं। मुझे यह जानने में अधिक दिलचस्पी है कि क्या "ए" वेरिएंट किए गए 2 मामलों में भिन्न व्यवहार करता है या नहीं। –

0

कच्चे प्रकार से है:

सभी इस निर्माण टाइम त्रुटि संकलन का कारण होगा जेनेरिक प्रकारों और प्रकार मिटाने की बाध्यता। यदि आपके पास ArrayList<? extends Shape> है तो बाध्य प्रकार आकार है और संकलन समय पर कच्चा प्रकार होगा।

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