예, a T...
는 a의 구문 설탕 일뿐 T[]
입니다.
목록의 마지막 형식 매개 변수는 특별합니다. 유형에 따라 줄임표로 표시되는 가변 arity 매개 변수 일 수 있습니다 .
마지막 형식 매개 변수가 유형의 변수 arity 매개 변수 인 경우 형식 T
의 형식 매개 변수를 정의하는 것으로 간주됩니다 T[]
. 이 방법은 가변 arity 방법입니다. 그렇지 않으면 고정 된 arity 방법입니다. 변수 arity 메소드의 호출에는 공식 매개 변수보다 더 많은 실제 인수 표현식이 포함될 수 있습니다. 변수 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[]
. 또한 배열은 공변량이므로 a String[]
는 a Object[]
이므로 ezFormat(args)
어느 쪽이든 호출 할 수 있습니다 .
또한보십시오
Varargs gotchas # 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"
관련 질문
다음은 varargs를 처리 할 때 사람들이 질문 한 일부 샘플입니다.
Vararg gotchas # 2 : 추가 인수 추가
알다시피, 다음은 "작동하지 않습니다":
String[] myArgs = { "A", "B", "C" };
System.out.println(ezFormat(myArgs, "Z"));
// prints "[ [Ljava.lang.String;@13c5982 ][ Z ]"
varargs가 작동하는 방식 때문에 ezFormat
실제로 두 개의 인수를 얻습니다. 첫 번째는 a String[]
이고 두 번째는 a String
입니다. 배열을 varargs에 전달하고 해당 요소를 개별 인수로 인식하고 추가 인수를 추가 해야하는 경우 추가 요소를 수용하는 다른 배열 을 만들 수밖에 없습니다 .
유용한 도우미 메소드는 다음과 같습니다.
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 ]"
Varargs는 참조 유형에서만 작동합니다. 오토 박싱은 기본 배열에는 적용되지 않습니다. 다음과 같이 작동합니다.
Integer[] myNumbers = { 1, 2, 3 };
System.out.println(ezFormat(myNumbers));
// prints "[ 1 ][ 2 ][ 3 ]"