Java에서 변수 인수를 사용하는 메서드에 배열을 인수로 전달할 수 있습니까?
다음과 같은 기능을 만들고 싶습니다.
class A {
private String extraVar;
public String myFormat(String format, Object ... args){
return String.format(format, extraVar, args);
}
}
여기서의 문제는 입니다.args
로 취급되다Object[]
그 방법으로는myFormat
즉, 에 대한 단일 인수입니다.String.format
한 사람 한 사람이Object
에args
새로운 논의로 통과될 것입니다.부터String.format
변수 인수가 있는 메서드이기도 합니다.이것은 가능합니다.
만약 이것이 가능하지 않다면, 다음과 같은 방법이 있을까요?String.format(String format, Object[] args)
그럼 내가 먼저 할 수 있어extraVar
로.args
새 어레이를 사용하여 해당 메서드에 전달합니다.
네, a.T...
통사당일 뿐이다T[]
.
JLS 8.4.1 포맷 파라미터
리스트의 마지막 형식 파라미터는 특수합니다.유형 뒤에 줄임표(elipsis)가 붙어 있는 변수 arity 파라미터일 수 있습니다.
마지막 형식 매개 변수가 유형의 변수 arity 매개 변수인 경우
T
, 타입의 형식 파라미터를 정의하는 것으로 간주됩니다.T[]
이 방법은 가변 아리티 방식입니다.그렇지 않으면 고정 아리티 방식입니다.변수 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[]
또한 배열은 공변성이기 때문에String[]
는 입니다.Object[]
를 호출할 수도 있습니다.ezFormat(args)
어느 쪽이든.
「 」를 참조해 주세요.
Varargs gotchas #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!!!
varargs가 해결되는 방법에 따라 마지막 문은 다음과 같이 호출됩니다.objs = null
물론 이 때문에NullPointerException
와 함께objs.length
하나 주고 싶으면null
인수를 vararargs 파라미터로 지정합니다.다음 중 하나를 수행할 수 있습니다.
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 ]"
, 「 」는 「 」를 참조해 주세요.ezFormat
두 인수가 , 첫는 2개입니다.첫 번째 인수는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 ]"
가변 메서드의 기본 유형function(Object... args)
하고 있다 function(Object[] args)
Sun은 하위 호환성을 유지하기 위해 이 방법으로 varargs를 추가했습니다.
그냥 에 붙일 수 거예요.extraVar
로로 합니다.args
를 호출합니다.String.format(format, args)
.
어레이를 전달해도 상관없습니다.사실 같은 의미입니다.
String.format("%s %s", "hello", "world!");
와 같다
String.format("%s %s", new Object[] { "hello", "world!"});
이것은 통사적인 설탕일 뿐입니다.기본 메서드는 vararg 파라미터의 배열을 상정하고 있기 때문에 컴파일러는 첫 번째 것을 두 번째 것으로 변환합니다.
봐
을 jasonmp85로 입니다.String.format
는 한 번 수 어레이를 새 어레이의 크기는 일단 구성되면 변경할 수 없기 때문에 기존 어레이를 변경하는 대신 새 어레이를 전달해야 합니다.
Object newArgs = new Object[args.length+1];
System.arraycopy(args, 0, newArgs, 1, args.length);
newArgs[0] = extraVar;
String.format(format, extraVar, args);
저도 같은 문제가 있었어요.
String[] arr= new String[] { "A", "B", "C" };
Object obj = arr;
그리고 나서 obj를 varargs 인수로 넘겼습니다.됐다.
언급URL : https://stackoverflow.com/questions/2925153/can-i-pass-an-array-as-arguments-to-a-method-with-variable-arguments-in-java
'programing' 카테고리의 다른 글
컴포넌트 및 Axios 내에서 데이터를 사용하는 경우 어떻게 데이터를 작동시키려면 어떻게 해야 합니까? (0) | 2022.08.24 |
---|---|
null과 빈("") Java 문자열의 차이 (0) | 2022.08.21 |
C의 printf 함수 코드 (0) | 2022.08.21 |
y -= m < 3은 무엇을 의미합니까? (0) | 2022.08.21 |
VueJ - Vue가 정의되어 있지 않습니다. (0) | 2022.08.21 |