यह 15.12.2.5 Choosing the Most Specific Method इस बारे में बात करते हैं, लेकिन यह काफी जटिल है। जैसे Foo (संख्या ... ints) और Foo (Integer ... ints) के बीच चयन
पिछड़े संगतता के हित में, ये प्रभावी रूप से एक ही चीज़ हैं।
public Foo(Object... args){} // syntactic sugar for Foo(Object[] args){}
// calls the varargs method.
Foo(new Object[]{new Object(), new Object()});
उदा। आप उन्हें अलग करने के लिए मुख्य()
रूप
public static void main(String... args) {
एक तरह से परिभाषित कर सकते हैं वे वास्तव में ही नहीं हैं varargs
public Foo(Object o, Object... os){}
public Foo(Object[] os) {}
Foo(new Object(), new Object()); // calls the first.
Foo(new Object[]{new Object(), new Object()}); // calls the second.
से पहले एक तर्क लेने के लिए है। सूक्ष्म अंतर यह है कि जब आप एक सरणी को एक सरणी पास कर सकते हैं, तो आप एक सरणी पैरामीटर को varargs के रूप में नहीं मान सकते हैं।
public Foo(Object... os){}
public Bar(Object[] os) {}
Foo(new Object[]{new Object(), new Object()}); // compiles fine.
Bar(new Object(), new Object()); // Fails to compile.
इसके अतिरिक्त, एक varags अंतिम पैरामीटर होना चाहिए।
public Foo(Object... os, int i){} // fails to compile.
public Bar(Object[] os, int i) {} // compiles ok.
स्रोत
2012-01-12 16:18:05
दिलचस्प प्रश्न +1 – mKorbel
मुझे कुछ याद आ रहा है, लेकिन आपको ओवरलोड की आवश्यकता क्यों है? यदि आप अपनी विधि को 'शून्य फू (ऑब्जेक्ट ... तर्क) के रूप में घोषित करते हैं तो आप इसे ** ** ** foo (नया ऑब्जेक्ट(), नया ऑब्जेक्ट()) ** ** या ** 'foo (नया ऑब्जेक्ट [] {नया ऑब्जेक्ट(), नया ऑब्जेक्ट()}) 'और एक ही परिणाम प्राप्त करें। एक उदाहरण के लिए [यह संबंधित प्रश्न] देखें (http://stackoverflow.com/questions/1656901/varargs-and-the-argument)। –
vararg टाइप किया गया विधि हस्ताक्षर के लिए सिर्फ एक झंडा है जो अंतिम घोषित सरणी (जैसे 'int [] 'या' ऑब्जेक्ट []') को vararg प्रकार में ट्रांसमिट कर रहा है। इसके अलावा - विधि हस्ताक्षर के बीच कोई अंतर नहीं। वही सवाल होगा जैसे 'निजी' और 'सार्वजनिक' विधि अधिभारित नहीं किया जा सकता है। – bestsss