आज मैं कुछ दिलचस्प पर ठोकर खाई ओवरराइड करना। निम्नलिखित जावा 6 वर्ग मान लें: यदि आप ऊपर के उदाहरण संकलित करने के लिए प्रयास करते हैं तोएक विधि का उपयोग प्रकार विलोपन
public class Ereasure {
public Object get(Object o) {
return null; // dummy
}
public static class Derived<T> extends Ereasure{
// (1)
@Override
public Object get(T o) {
return super.get(o);
}
// (2)
/*
@Override
public Object get(Object o) {
return super.get(o);
}*/
}
}
, संकलक का कहना है Ereasure.java:9: विधि पर हावी नहीं होता या एक महाप्रकार से एक विधि को लागू @Override हैं (! जो आवश्यक नहीं होना चाहिए) आप @Override टिप्पणी निकालने, यह कहता है Ereasure.java:8: नाम टकराव: Ereasure में Ereasure.Derived में (टी) हो जाते हैं और मिल (java.lang.Object) है एक ही विलोपन , अभी तक न तो अन्य इसमें कुछ समय contradictional है ओवरराइड करता है, के बाद से टी वस्तु को erease चाहिए और ओवरराइड वजह माता पिता कक्षाएं विधि मिलता है।
आप छोड़ देते हैं (1) unannotated और टिप्पणी हटाएं (2) तो (1) भार के (2) यह या तो काम नहीं होगा। संकलक उत्पादन:
Ereasure.java:15: get(T) is already defined in Ereasure.Derived
public Object get(Object o) {
एक निष्कर्ष के रूप में, टी वस्तु को ereased की जा रही है, लेकिन ओवरराइड नहीं कर सकते माता पिता विधि मिलता है।
मेरा प्रश्न है, क्यों उदाहरण के कम से कम एक संकलन dooesn't?
@ toto2 मैं अपने दाहिने लगता है, लेकिन मैं भी अपने एक दिलचस्प प्रतीत होता है गैर-दस्तावेजी कोने मामले में सोचते हैं। टाइप एरर पर सूर्य कंपाइलर नोट्स के मुताबिक डेरिवेट में विधि परिभाषा को व्युत्पन्न प्रकार में व्युत्पन्न प्रकार को सार्वजनिक ऑब्जेक्ट प्राप्त करने (ऑब्जेक्ट ओ) में परिवर्तित करना चाहिए, क्योंकि इसके बाद माता-पिता का सबसिग्नेचर इसे ओवरराइड करना चाहिए। मुझे लगता है कि वह सही है कोई रास्ता नहीं है कि वहाँ जब विधि प्रेषण अस्पष्टता कि असीम प्रकार से परिणाम को हल करने बाईटकोड में इस बात मंथन। – nsfyn55