{a, b, c}를 메서드에 전달하면 작동하지 않는 이유는 무엇입니까?
-
06-07-2019 - |
문제
초기화 목록 {...}을 생성자에 전달하려고 했지만 작동하지 않았습니다.대신 메서드 로컬 변수(int[])에서 선언했을 때 완벽하게 작동했습니다.
왜 그런 겁니까?
public class QuickSort {
int[] a;
public QuickSort(int[] a) {
this.a = a;
}
public static void main(String[] args) {
// ###################
// ### WORKS ##
// ###################
int[] a = {8,12,79,12,50,44,8,0,7,289,1};
QuickSort sort = new QuickSort(a);
// ###################
// ### DOESN'T WORK ##
// ###################
//QuickSort sort = new QuickSort({8,12,79,12,50,44,8,0,7,289,1});
}
}
해결책
선언 할 때 int[]
그리고 할당 {1, 2, 3}
컴파일러는 당신이 당신이 만들고 싶다는 것을 알고 있습니다 int[]
바로 거기에 철자가 있습니다.
후자의 경우 배열을 메소드 호출에 직접 붙이는 경우 사용해야합니다.
QuickSort sort = new QuickSort(new int[] {8,12,79,12,50,44,8,0,7,289,1});
컴파일러에 배열이 무엇인지 알려줍니다.
다른 팁
그만큼 {}
구문은 배열 초기화라고 하며 Java에서 배열을 초기화하는 데 사용됩니다.(참조: 섹션 10.6:배열 초기화 프로그램 ~에서 Java 언어 사양, 제3판.)
합격한 이유 {1, 2, 3}
자체가 유효하지 않은 이유는 이니셜라이저와 연결된 유형 정보가 없기 때문입니다.
그러므로 컴파일러에게 배열의 유형이 다음과 같이 작성되어 있음을 알려야 합니다. new Type[]
, 여기서 Type
배열이 만들어지는 유형입니다.
다음은 모두 배열 초기화 프로그램의 유효한 사용입니다:
new String[] {"Hello, "World"}
new Character[] {'A', 'B'}
new Runnable[] {new Runnable() {public void run() {}}, new Runnable() {public void run() {}}
보시다시피, 이 표기법은 다양한 데이터 유형에 사용될 수 있으므로 정수에만 해당되는 것이 아닙니다.
에 관해서는:
int[] a = {1, 2, 3};
위의 내용이 유효한 이유는 변수 유형 선언에서 유형 정보가 컴파일러에 제공되기 때문입니다. int[]
.위의 내용이 의미하는 바는 다음과 같습니다.
int[] a = new int[] {1, 2, 3};
이제 우리가 가지고 있다면 new int[] {1, 2, 3}
, 우리는 새로운 것을 만들 수 있습니다 int[]
배열이 제자리에 있으므로 다른 방식으로 처리할 수 있습니다. int[]
배열은 관련 변수 이름이 없다는 것입니다.
따라서 다음에 의해 생성된 배열은 new int[] {1, 2, 3}
메소드나 생성자로 전송될 수 있습니다. int[]
인수로 :
new Quicksort(new int[] {1, 2, 3}); // This will work.
초기화 목록에 입력 정보가 없기 때문일 수 있습니다.이 시도:
QuickSort sort = new QuickSort(new int[] {8,12,79,12,50,44,8,0,7,289,1});
당신은 또한 이것을 좋아할 수 있습니다 :
public class QuickSort {
int[] a;
public QuickSort(int ... a) {
this.a = a;
}
public static void main(String[] args) {
QuickSort sort = new QuickSort(8,12,79,12,50,44,8,0,7,289,1);
}
}
Java에는 실제로 유형의 추론이 없습니다. 배열 변수 선언은 a 특별한 경우 Java 언어 사양에서는 메소드 매개 변수에 적용되지 않는 것입니다. 그렇게 할 수는 있지만 { "a", "b"}와 같은 질문을 처리해야하기 때문에 사양에 많은 복잡성을 더할 것입니다. 그러나 복잡한 유형 계층 구조의 객체라면 어떨까요? 메소드가 과부하되고 두 버전이 모두 존재하면 어떻게됩니까?
곱슬 브레이스 (배열 리터럴에서 사용될 때) 배열을 선언 할 때만 사용할 수 있습니다 :)
목록을 생성자에게 전달하기 전에 목록을 int []에 캐스팅 해 보셨습니까?