मैं आज इस में भाग गया और केवल एक चीज जो मैं सोच सकता हूं वह यह है कि यह जावा कंपाइलर में एक बग है। निम्न कोड संकलित करता है, लेकिन निश्चित रूप से गलत लगता है (चूंकि testMethod में बच्चे में एक differenet हस्ताक्षर है लेकिन माता-पिता को ओवरराइड करता है) और रनटाइम पर क्लास कास्ट अपवाद फेंक देगा।जेनेरिक जोड़ना आपको एक अलग रिटर्न प्रकार के साथ एक विधि को ओवरराइड करने की अनुमति देता है?
public interface TestInterface<T> {
public List<String> testMethod(); // <-- List<String>
}
public class TestClass implements TestInterface {
@Override
public List<Integer> testMethod() { // <-- List<Integer> overriding List<String>!!
return Collections.singletonList(1);
}
}
और इसके बाद के संस्करण संरचना का उपयोग:
public void test() {
TestInterface<Boolean> test = new TestClass();
List<String> strings = test.testMethod();
for (String s : strings) {
System.out.println(s);
}
}
यह सब ठीक संकलित, लेकिन अगर आप इसे चलाने के स्पष्ट रूप से वर्ग डाली अपवाद फेंक देते हैं।
आप TestInterface
से <T>
हटाने, या लाइन TestClass implements TestInterface<T>
तो कोड अब संकलन होगा, जो समझ में आता है में में T
भरें। इमो <T>
testMethod
के संकलन पर कोई असर नहीं होना चाहिए क्योंकि यह उस विधि में कोई भूमिका नहीं निभाता है। शायद टेस्टइंटरफेस में <T>
जोड़ना संकलक को विधि हस्ताक्षर टाइप करने का कारण बन रहा है भले ही T
उन विधियों में भाग नहीं लेता है ...?
क्या किसी को पता है कि यहां क्या हो रहा है?
+1। सामान्य कार्यान्वयन –