2010-10-05 13 views
8

जहां मैं दो स्थैतिक ओवरलोडिंग विधियों को बनाने का प्रयास करता हूं, मुझे संकलन त्रुटि मिली है। क्या कोई इसजेनेरिक के साथ स्टेटिक विधि ओवरलोडिंग

public class A { 
public static void a(Set<String> stringSet) {} 
public static void a(Set<Map<String,String>> mapSet) {} 
} 
+0

त्रुटि क्या है? – kasten

उत्तर

14

कारण type erasure है। जेनिक्स कक्षाओं में संग्रहित नहीं होते हैं, वे संकलित समय की जानकारी केवल होते हैं, इसलिए रनटाइम पर, दो विधियां समान होती हैं और इसलिए नामकरण संघर्ष होता है।

संदर्भ

इन तीन तरीकों वास्तव में समान (पढ़ें: वे समान बाईटकोड उत्पादन): कर रहे हैं

public static void a(Set plainSet) {} 
public static void a(Set<String> stringSet) {} 
public static void a(Set<Map<String,String>> mapSet) {} 

यदि आप वास्तव में दो अलग-अलग विधियां चाहते हैं, तो आपको विभिन्न विधि हस्ताक्षर प्रदान करना होगा (उदा। विभिन्न विधि नाम, विधियों में से एक के लिए एक अतिरिक्त पैरामीटर इत्यादि)

+0

संकल्प समय पर विधि समाधान किया जाता है, इसलिए जावा भाषा को विस्तार के बिना इस तरह के ओवरलोडिंग की अनुमति देने के लिए बढ़ाया जा सकता है। हालांकि, बेहतर विधि नामकरण पर जोर देना शायद आसान है। –

+0

हां, लेकिन उद्देश्य बाइनरी प्रारूप को तोड़ना नहीं था (विरासत कोड को काम करना जारी रखना था, यहां तक ​​कि नए कोड के साथ) –

1

विधियों के पैरामीटर Set<String> और Set<Map<String,String>> के दृष्टिकोण से समान हैं, क्योंकि सामान्य वर्ग के सभी उदाहरणों में समान रन-टाइम क्लास होती है (अपने मामले में सेट करें), उनके वास्तविक प्रकार पैरामीटर के बावजूद। इसलिए आपको erasure error मिलेगा। इसके अलावा रनटाइम पर दोनों देखो की तरह ... public static void a(Set stringSet) {} और public static void a(Set mapSet) {}

0

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

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