2014-11-05 6 views
6

type erasure page का कहना है किइस प्रकार पैरामीटर बाइटकोड में संरक्षित क्यों है?

उनकी सीमा या वस्तु के साथ सामान्य प्रकार के सभी प्रकार के पैरामीटर बदलें यदि प्रकार पैरामीटर असीम हैं। उत्पादित बाइटकोड, इसलिए, केवल सामान्य वर्ग, इंटरफेस, और विधियों में शामिल हैं।

हालांकि, निम्नलिखित वर्ग के लिए:

public class Foo<E extends CharSequence> { 
    public E something; 
} 

javap -c Foo प्रिंट:

public class Foo<E extends java.lang.CharSequence> { 
    public E something; 
} 

क्यों प्रकार पैरामीटर बाध्य (CharSequence) से बदल नहीं है, लेकिन ई के रूप में संरक्षित किया जाता है?

उत्तर

7

जो आपने मुद्रित किया है वह बाइटकोड नहीं है। यह विधि हस्ताक्षर है। यह वहां रखा गया है ताकि संकलक अन्य वर्गों को संकलित करते समय टाइपफैटी को लागू कर सकें।

2

टाइप जानकारी कक्षाओं और विधियों पर संरक्षित है, लेकिन वास्तविक चर पर नहीं। यदि आप

class Foo extends Bar<String> { 
} 

लिखा था ... आप रनटाइम पर Bar<String> निकाल सकते हैं, लेकिन आप

new Bar<String>(); 

था ... आप नहीं निकालने Bar<String> वहाँ सकता है।

0

प्रकार पैरामीटर संरक्षित है क्योंकि इसे उप-वर्गीकरण के लिए जाना जाना चाहिए। परिभाषाएँ

public class Foo<E extends CharSequence> 

और

public class Foo<CharSequence> 

,, नहीं के बराबर हैं के बाद से बाद के उप-वर्ग के रूप में घोषित किए जाने की अनुमति नहीं होगी कहते हैं:

public class MyStringFoo extends Foo<String> { } 

जबकि पूर्व करता है।

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