हाँ, एक T...
केवल एक के लिए एक कृत्रिम चीनी है T[]
।
किसी सूची में अंतिम औपचारिक पैरामीटर विशेष है; यह एक वैरिएबल एरिटी पैरामीटर हो सकता है , जो कि टाइप के बाद एलिप्सिस द्वारा दर्शाया गया है।
यदि अंतिम औपचारिक पैरामीटर प्रकार का एक वैरिएबल एरिटी पैरामीटर है T
, तो यह प्रकार के एक औपचारिक पैरामीटर को परिभाषित करने के लिए माना जाता है T[]
। विधि तो एक चर arity विधि है। अन्यथा, यह एक निश्चित विधि है। एक वैरिएबल एरिटी विधि के इनवॉइस में औपचारिक मापदंडों की तुलना में अधिक वास्तविक तर्क अभिव्यक्ति हो सकती है। सभी वास्तविक तर्क अभिव्यक्तियाँ जो कि वैरिएबल एरिटी पैरामीटर से पहले के औपचारिक मापदंडों के अनुरूप नहीं हैं, का मूल्यांकन किया जाएगा और एक सरणी में संग्रहीत परिणामों को विधि मंगलाचरण में पास किया जाएगा।
यहाँ एक उदाहरण दिया गया है:
public static String ezFormat(Object... args) {
String format = new String(new char[args.length])
.replace("\0", "[ %s ]");
return String.format(format, args);
}
public static void main(String... args) {
System.out.println(ezFormat("A", "B", "C"));
// prints "[ A ][ B ][ C ]"
}
और हां, उपरोक्त main
विधि मान्य है, क्योंकि फिर से, String...
बस है String[]
। इसके अलावा, क्योंकि सरणियाँ सहसंयोजक हैं, एक एक String[]
है Object[]
, इसलिए आप किसी भी ezFormat(args)
तरह से कॉल कर सकते हैं ।
यह सभी देखें
वरगार्स गोचेज # 1: पासिंग null
कैसे varargs हल किया जाता है काफी जटिल है, और कभी-कभी यह उन चीजों को करता है जो आपको आश्चर्यचकित कर सकते हैं।
इस उदाहरण पर विचार करें:
static void count(Object... objs) {
System.out.println(objs.length);
}
count(null, null, null); // prints "3"
count(null, null); // prints "2"
count(null); // throws java.lang.NullPointerException!!!
कैसे varargs हल कर रहे हैं के कारण, के साथ पिछले बयान का आह्वान objs = null
है, जो निश्चित रूप से कारण होगा NullPointerException
साथ objs.length
। यदि आप null
एक varargs पैरामीटर में एक तर्क देना चाहते हैं , तो आप निम्न में से कोई एक कार्य कर सकते हैं:
count(new Object[] { null }); // prints "1"
count((Object) null); // prints "1"
संबंधित सवाल
निम्नलिखित में से कुछ प्रश्नों का एक नमूना है जो लोगों ने वैरग से निपटने के दौरान पूछे हैं:
वरर्ग गोच # 2: अतिरिक्त तर्क जोड़ रहा है
जैसा कि आपको पता चला है, निम्नलिखित "काम" नहीं करता है:
String[] myArgs = { "A", "B", "C" };
System.out.println(ezFormat(myArgs, "Z"));
// prints "[ [Ljava.lang.String;@13c5982 ][ Z ]"
जिस तरह से varargs काम करता है, ezFormat
वास्तव में 2 तर्क मिलते हैं, पहला एक होने का String[]
, दूसरा दूसरा होने का String
। यदि आप वर्णों के लिए एक सरणी पास कर रहे हैं, और आप चाहते हैं कि इसके तत्वों को अलग-अलग तर्कों के रूप में मान्यता दी जाए, और आपको एक अतिरिक्त तर्क भी जोड़ना होगा, तो आपके पास अतिरिक्त तत्व को समायोजित करने वाला एक और सरणी बनाने के अलावा कोई विकल्प नहीं है ।
यहां कुछ उपयोगी सहायक विधियां दी गई हैं:
static <T> T[] append(T[] arr, T lastElement) {
final int N = arr.length;
arr = java.util.Arrays.copyOf(arr, N+1);
arr[N] = lastElement;
return arr;
}
static <T> T[] prepend(T[] arr, T firstElement) {
final int N = arr.length;
arr = java.util.Arrays.copyOf(arr, N+1);
System.arraycopy(arr, 0, arr, 1, N);
arr[0] = firstElement;
return arr;
}
अब आप निम्नलिखित कर सकते हैं:
String[] myArgs = { "A", "B", "C" };
System.out.println(ezFormat(append(myArgs, "Z")));
// prints "[ A ][ B ][ C ][ Z ]"
System.out.println(ezFormat(prepend(myArgs, "Z")));
// prints "[ Z ][ A ][ B ][ C ]"
Varargs gotchas # 3: प्राथमिकताओं की एक सरणी से गुजर रहा है
यह "काम" नहीं करता है:
int[] myNumbers = { 1, 2, 3 };
System.out.println(ezFormat(myNumbers));
// prints "[ [I@13c5982 ]"
वैराग्य केवल संदर्भ प्रकारों के साथ काम करता है। ऑटोबॉक्सिंग आदिम की सरणी पर लागू नहीं होता है। निम्नलिखित कार्य:
Integer[] myNumbers = { 1, 2, 3 };
System.out.println(ezFormat(myNumbers));
// prints "[ 1 ][ 2 ][ 3 ]"