হ্যাঁ, একটি T...এটির জন্য কেবল একটি সিনট্যাকটিক চিনিT[] ।
একটি তালিকার সর্বশেষ আনুষ্ঠানিক পরামিতি বিশেষ; এটি একটি পরিবর্তনশীল আরটি হতে পারে পরামিতি , ধরণের অনুসরণ করে একটি এলিপসিস দ্বারা নির্দেশিত।
যদি শেষ আনুষ্ঠানিক প্যারামিটারটি একটি পরিবর্তনশীল আরটি প্যারামিটার হয় তবে এটি প্রকারের Tএকটি আনুষ্ঠানিক প্যারামিটার সংজ্ঞায়িত হিসাবে বিবেচিত হয় T[]। পদ্ধতিটি তখন একটি পরিবর্তনশীল আরটি পদ্ধতি। অন্যথায়, এটি একটি স্থির আরেটি পদ্ধতি। একটি পরিবর্তনশীল আরটি পদ্ধতির অনুরোধে আনুষ্ঠানিক পরামিতিগুলির তুলনায় আরও প্রকৃত যুক্তি প্রকাশ হতে পারে। সমস্ত আসল আর্গুমেন্ট এক্সপ্রেশন যা ভেরিয়েবল আরটি প্যারামিটারের পূর্ববর্তী আনুষ্ঠানিক প্যারামিটারগুলির সাথে সামঞ্জস্য করে না সেগুলি মূল্যায়ন করা হবে এবং ফলাফলকে অনুরোধে পাস করা হবে এমন একটি অ্যারেতে ফলাফল সংরক্ষণ করা হবে।
উদাহরণস্বরূপ এখানে উদাহরণ দেওয়া হল:
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
ভারার্গগুলি কীভাবে সমাধান করা হয় তা বেশ জটিল এবং কখনও কখনও এটি এমন কিছু করে যা আপনাকে অবাক করে।
এই উদাহরণ বিবেচনা করুন:
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!!!
কিভাবে ভারার্গস মীমাংসা করা হয় কারণে গত বিবৃতি পূজা objs = null, অবশ্যই যা কারণ হবে NullPointerExceptionসঙ্গে objs.length। আপনি যদি nullভারার্গ্স প্যারামিটারে একটি যুক্তি দিতে চান তবে আপনি নিম্নলিখিতগুলির মধ্যে দুটি করতে পারেন:
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 ]"
ভারার্গস যেভাবে কাজ করে তার কারণে 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 ]"
ভারার্গস গেটচস # 3: আদিম একটি অ্যারে পেরিয়ে যাচ্ছে
এটি "কাজ" করে না:
int[] myNumbers = { 1, 2, 3 };
System.out.println(ezFormat(myNumbers));
// prints "[ [I@13c5982 ]"
Varargs কেবল রেফারেন্স ধরণের সাথে কাজ করে। আদিবক্সিং আদিমগুলির অ্যারেতে প্রযোজ্য না। নিম্নলিখিত কাজগুলি:
Integer[] myNumbers = { 1, 2, 3 };
System.out.println(ezFormat(myNumbers));
// prints "[ 1 ][ 2 ][ 3 ]"