2013-09-25 10 views
8
public interface Expression { 

} 

public interface ArithmeticExpression extends Expression { 

} 


public class StaticMethodDemo { 
    public static void print(Expression e) { 
    System.out.println("StaticMethodDemo"); 
    } 

    public static List<Expression> convert(
     Collection<? extends Expression> input) { 
    return null; 
} 
} 


public class StaticMethodChild extends StaticMethodDemo { 

    public static void print(ArithmeticExpression e) { 
    System.out.println("StaticMethodChild"); 
    } 

    public static List<ArithmeticExpression> convert(
     Collection<? extends ArithmeticExpression> input) { 
    return null; 
    } 
} 

कोड से ऊपर जावा 5 में संकलित में ठीक काम करता है, लेकिन जावा 7 क्यों नहीं? जावा 7 में यह "नाम संघर्ष: प्रकार का कन्वर्ट (संग्रह) प्रकार StaticMethodChild में StaticMethodDemo प्रकार के कन्वर्ट (संग्रह) के समान मिटा है, लेकिन इसे छिपा नहीं है"नाम संघर्ष त्रुटि संकलन जब जावा 7 में संकलित लेकिन जावा 5

उत्तर

2

जावा स्थैतिक तरीकों को ओवरराइड करने की अनुमति नहीं देता है। Why doesn't Java allow overriding of static methods?

एकमात्र चीज जो आप कर सकते हैं वह सबक्लास में एक स्थिर विधि छिपाती है। छिपाने का मतलब है कि यह इस बात पर निर्भर नहीं है कि किस प्रकार की वस्तु को बुलाया जाता है, लेकिन किस प्रकार की कक्षा पर। देखें http://docs.oracle.com/javase/tutorial/java/IandI/override.html

अब समस्या यह है कि आपकी उप-वर्ग विधि औपचारिक रूप से एक ही हस्ताक्षर है लेकिन सामान्य प्रकारों के कारण यह इसे छुपा नहीं रहा है। Collection<? extends ArithmeticExpression> न तो वही है और न ही Collection<? extends Expression> का उपप्रकार व्यावहारिक रूप से सही, अस्पष्ट छिपाने से रोक रहा है। जैसा कि अयबी ने इंगित किया था, संकलक नियम को पीछे की संगतता सुनिश्चित करने के लिए पेश किया गया था: Method has the same erasure as another method in type

अभी अपने लिए यह कोशिश नहीं कर सकता है, लेकिन दोनों को समान सामान्य प्रकार होने पर त्रुटि को अपमानित करना चाहिए। हालांकि मुझे पता नहीं है कि जावा 5 में त्रुटि क्यों नहीं होती है। मुझे लगता है कि उन्होंने बाद के संस्करण में उस कंपाइलर नियम को पेश किया क्योंकि उन्होंने पहले इसे नोटिस नहीं किया था।

+0

स्पष्टीकरण के लिए धन्यवाद। वर्तमान में मैं एक परियोजना पर काम कर रहा हूं जहां हम जावा 7 में माइग्रेट कर रहे हैं और बड़ी संख्या में कक्षाओं में यह समस्या है। इसके अलावा मुझे उन विधियों के साथ भी समस्या का सामना करना पड़ रहा है जिनमें वर्गा है। – Dragon

+0

आपको उन सभी वर्गों को निश्चित रूप से दोबारा परिभाषित करना चाहिए क्योंकि यह त्रुटियों का स्रोत है। –

4

स्टोनडेक्विरल के जवाब के अलावा, भले ही विधियां स्थैतिक न हों, आपको भी वही त्रुटि मिल जाएगी।

यह टाइप एरर के कारण है, तो आप एक असंगत प्रकार के साथ कनवर्ट करने की कोशिश करेंगे।

एक अच्छा स्पष्टीकरण के लिए निम्नलिखित answer देखें।

+0

अन्य लिंक्ड उत्तर ओपी के समान त्रुटि के लिए नहीं है, कि दूसरा उत्तर टाइप एरर के बारे में बात करता है, लेकिन यह स्थिर विधियों और त्रुटि के मुख्य बिट को संदर्भित नहीं करता है जो "इसे छिपाता नहीं है" –

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