2014-12-04 6 views
14

मैं कुछ varargs प्रणाली समारोह है, जहां टी String जैसे कुछ वास्तविक प्रकार, है से एक अतिरिक्त तर्क के साथ एक varargs विधि कॉल करने के:कैसे एक varargs विधि

sys(T... args) 

मैं खुद समारोह है, जो प्रतिनिधियों बनाना चाहते हैं सिस्टम समारोह के लिए। मेरा कार्य भी एक varargs फ़ंक्शन है। मैं अपने फ़ंक्शन के लिए सिस्टम फ़ंक्शन के साथ-साथ एक अतिरिक्त पीछे तर्क के माध्यम से सभी तर्कों को पार करना चाहता हूं। कुछ ऐसा:

myfunc(T... args) { 
    T myobj = new T(); 
    sys(args, myobj); // <- of course, here error. 
} 

मुझे त्रुटि के साथ लाइन को बदलने की आवश्यकता कैसे है? अब मैं केवल एक ही रास्ता देखता हूं: आयाम के साथ सरणी बनाएं [तर्क] + 1 और सभी वस्तुओं को नई सरणी में कॉपी करें। लेकिन शायद एक और आसान तरीका मौजूद है?

+1

@aioobe, वास्तविक ऑब्जेक्ट प्रकार, अन्यथा, अगर मैं ठीक है, मैं नहीं बना सकते myobj। कुछ पहले संदेश –

+0

बदलते हैं इसलिए मैं पूछ रहा था ;-) – aioobe

उत्तर

7

अब मैं केवल एक ही रास्ता देखता हूं: आयाम के साथ सरणी बनाएं [तर्क] + 1 और सभी वस्तुओं को नई सरणी में कॉपी करें।

कोई आसान तरीका नहीं है। आपको एक नई सरणी बनाने और सरणी के अंतिम तत्व के रूप में myobj शामिल करने की आवश्यकता है।

String[] args2 = Arrays.copyOf(args, args.length + 1); 
args2[args2.length-1] = myobj; 
sys(args2); 

आप अपाचे कॉमन्स लैंग पर निर्भर हैं तो आप यदि आदेश की परवाह नहीं करता क्या कर सकते हैं

sys(ArrayUtils.add(args, myobj)); 

या अमरूद

sys(ObjectArrays.concat(args, myobj)); 
6

आप sys() दो बार फोन कर सकते हैं:

T myobj=new T(); 
sys(myobj); 
sys(args); 

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

+1

मैं इस कॉल को नहीं कर सकता, क्योंकि परिणामस्वरूप कुछ अन्य वस्तुएं sys वापस आती हैं, इनपुट पैरा से निर्भर होती हैं। उदाहरण के लिए: string.format()। –

+0

फिर आपको उन सभी कार्यों के लिए सरणी कॉपी या संग्रह का उपयोग करना होगा। फिर आप अपना नया आइटम जोड़ सकते हैं। – brummfondel

+0

@brummfondel, क्या आप सुझाव दे रहे हैं कि उन्हें तर्क संग्रह को संशोधित करना चाहिए? यह कॉलर के लिए बहुत विनम्र नहीं है (और केवल तभी काम करता है जब तर्क एक परिवर्तनीय संग्रह है)। – aioobe

2

आप Guava का उपयोग कर सकते हैं, तो आप कर सकते हैं:

sys(ObjectArrays.concat(myobj, args)) 
1

जावा 8 समाधान:

sys(Stream.concat(Arrays.stream(args), Stream.of(myobj)).toArray(T[]::new)); 
संबंधित मुद्दे