2012-06-28 6 views
6

मुझे टाइप किए गए सूची पैरामीटर वाले किसी विधि के साथ कुछ समस्याएं हैं, जो किसी अन्य (टाइप की गई) कक्षा से विरासत में मिली हैं।टाइप की गई सूची और विरासत के साथ विधि

के यह सरल रखने करते हैं:

public class B<T> { 
    public void test(List<Integer> i) { 
    } 
} 

बी वर्ग एक बेकार सामान्य टी, और परीक्षण() एक पूर्णांक सूची चाहते हैं।

अब अगर मैं कार्य करें:

public class A extends B { 
    // don't compile 
    @Override 
    public void test(List<Integer> i) { 
    } 
} 

मैं एक "ग्रुप ए के विधि परीक्षण (सूची) ओवरराइड या एक महाप्रकार विधि को लागू करना चाहिए" त्रुटि मिलती है, कि ऐसा नहीं होना चाहिए।

लेकिन सूची के प्रकार को हटाने से काम करता है ... हालांकि यह कक्षा जेनेरिक पर निर्भर नहीं है।

public class A extends B { 
    // compile 
    @Override 
    public void test(List i) { 

और यह भी नीचे बेकार सामान्य को परिभाषित टाइप किया सूची

public class A extends B<String> { 
    // compile 
    @Override 
    public void test(List<Integer> i) { 

तो मैं पता कर रहा हूँ उपयोग करने के लिए, बी के जेनेरिक परीक्षण() सूची के प्रकार पर कोई असर नहीं होना चाहिए। क्या किसी के पास क्या हो रहा है इसका विचार है?

धन्यवाद

+0

मेरा मानना ​​है कि आपका उत्तर निहित है [यहां] (http://stackoverflow.com/a/502770/248082)। – nobeh

+0

परंपरागत रूप से [पूंजी वी] 'शून्य 'सामान्य पैरामीटर के लिए उपयोग किया जाता है जिसका आप उपयोग नहीं करना चाहते हैं। उदाहरण के लिए जो एक मूल्य लौटाए बिना 'java.security.PreivilegedAction' का उपयोग कर रहा है (वापसी' शून्य '- यह केवल वैध' शून्य 'संदर्भ है)। –

उत्तर

8

आप कच्चे प्रकार के बी का विस्तार कर रहे हैं, सामान्य नहीं। कच्चे व्यक्ति के पास प्रभावी रूप से test(List<Integer> i) विधि नहीं है, लेकिन test(List) विधि है।

यदि आप कच्चे प्रकार, पर स्विच करते हैं तो सभी जेनिक्स को कच्चे द्वारा प्रतिस्थापित किया जाता है, भले ही उनका प्रकार भर गया हो या नहीं।

इसे ठीक से करने के लिए,

public class A<T> extends B<T> 

यह सामान्य प्रकार B<T> है, जो विधि आप ओवरराइड करना चाहते शामिल का उपयोग होगा।

+0

धन्यवाद। वास्तव में तार्किक नहीं है क्योंकि हम टी का उपयोग नहीं कर रहे हैं, लेकिन जावा के जेनेरिकों में कुछ डिज़ाइन त्रुटियां हैं जिनसे हमें निपटना होगा। – PomPom

1

जब आप (और यह कच्चे का उपयोग करें) जेनरिक के बिना एक वर्ग का उपयोग निकालने के लिए, वर्ग तरीकों से सभी जेनरिक भूल कर रहे हैं।

इस कारण के कारण जब आप दूसरे मामले पर सामान्य प्रकार को सूचित करते हैं तो आप इसे काम करते हैं।

यह:

class A extends T { 
} 

इस तरह दिखेगा:

class T { 
    public void test(Object g); 
} 

यह एक जावा आईओ 2011 Google पर प्रस्तुत पहेली आप वीडियो देख सकते था

class T<G> { 
    public void test(G g); 
} 
इस मामले में

here

+0

असली समस्या यह है कि मैं जी का उपयोग नहीं कर रहा था लेकिन एक ठोस वर्ग। वैसे भी मुझे मेरा जवाब मिला – PomPom

+0

आप कच्चे वर्ग का उपयोग कर रहे थे। –