2015-01-18 4 views
5

है मेरे पास एक अमूर्त वर्ग है जिसमें एक कन्स्ट्रक्टर है जो varargs लेता है। जावा कंपाइलर को लगता है कि बाल वर्ग सुपर() को कॉल करते हैं, भले ही प्रत्येक कन्स्ट्रक्टर तर्क लेता है।जावा: सुपर क्लास को सुपर() को कॉल करने के लिए उप-वर्गों की आवश्यकता कैसे होती है जब सुपर की तर्क एक vararg

public abstract class Parent { 
    public Parent(String... varargs) { 

    } 
} 

public class Child extends Parent { 
    // I would like this to be a compile error. Child should always call super(). 
} 

मैं कैसे Parent तो लिख सकते हैं कि बच्चों को super() कॉल करना होगा?

+0

ऐसा इसलिए है क्योंकि बच्चा अमूर्त – JClassic

+0

बच्चे को विस्तारित करने वाला कोई भी वर्ग एक कन्स्ट्रक्टर होना चाहिए जो सुपर() – JClassic

+0

पर कॉल करता है, चाइल्ड पर अमूर्त कीवर्ड एक टाइपो था - कोड इसके बिना ठीक संकलित करता है। – Sam

उत्तर

4

एक varargs विधि का उद्देश्य प्रोग्रामर को प्रत्येक तर्क को व्यक्तिगत रूप से लिखने की अनुमति देना है, इसलिए कम से कम एक पास होने के लिए एक ही प्रकार की एक आवश्यक तर्क तैयार करना संभव है। कॉलर्स जिनके पास सूची है या सरणी, एक वैकल्पिक कन्स्ट्रक्टर Iterable स्वीकार कर सकते हैं।

public abstract class Parent2 { 
    public Parent2(String firstArg, String... varargs) { 

    } 

    public Parent2(Iterable<? extends String> args) { 

    } 
} 

public class Child2 extends Parent2 { 
    public Child2() { 
     super("abc"); 
    } 
} 
+1

यह वास्तव में आपके प्रश्न का उत्तर नहीं देता ** ** लिखित ** के रूप में। आपने वास्तव में क्या किया है "सुपर या अधिक तर्क" से "एक या अधिक तर्क" में सुपरक्लास कन्स्ट्रक्टर के हस्ताक्षर को बदलना है। –

3
docs से

, एक विधि/निर्माता एक varargs पैरामीटर को स्वीकार करने के लिए पारित पैरामीटर की संख्या,, कोई भी हो सकता है एक डिफ़ॉल्ट पैरामीटर कम निर्माता के रूप में भी निर्माता कलाकार बना दिया।

varargs उपयोग करने के लिए, आप एक अंडाकार द्वारा पिछले पैरामीटर के प्रकार (तीन डॉट्स, ...), तो एक जगह है, और पैरामीटर नाम का पालन करें। विधि को उस पैरामीटर की किसी भी संख्या के साथ बुलाया जा सकता है, कोई भी नहीं।

तो आप इसे एक सरणी को बदल सकता है,

abstract class Parent { 
    public Parent(String[] varargs) { 

    } 
} 

अपने बच्चे निर्माता इस निर्माता स्पष्ट रूप से कॉल करने के लिए मजबूर किया जाएगा।

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