2013-06-04 2 views
4

왜 다음은 정수 목록을 반환하지 않습니까? Arrays.asList 반환 형식 불일치 혼란

int[] ints = new int[] { 1, 2, 3, 4, 5 }; 
List<Integer> intsList = Arrays.asList(ints); //compilation error 

하지만 그 대신이

String[] strings = new String[] { "Hello", "World" }; 
List<String> stringsList = Arrays.asList(strings); 

동안 int[]

의 목록

String의리스트를 돌려줍니다. 나는 그것이 프리미티브의 배열이기 때문에 실패한 것 같지만 그 이유는 무엇입니까? 그리고 실제로 어떻게 int의 목록을 반환합니까?

+0

'List' 안에'Object' 만 가질 수 있습니다. 이것은 int의 목록을 배제합니다. –

+1

나는 그것이 autoboxed하게 될 것이기를 바라고 있었다. – arynaq

+0

그러나 목록 은 컴파일 오류를 발생시킵니다. – eternay

답변

2

T 착각 생각합니다. ...을 사용하여 int[]의 배열 즉 int[][]을 제공하고 있으므로 다른 해석 만 있습니다. 그러면 List<int[]>이됩니다.

StringObject의 하위 유형이므로 예상대로 작동합니다. 또한 J2SE 5.0의 varargs 도입 이전에 작동 할 수있는 유일한 방법입니다. 일반적으로 기존 코드의 해석은 언어 버전간에 변경해서는 안됩니다.

List<Integer>을 원하면 각 정수를 입력하고 상자에 넣을 수 있습니다. 프로그램에 이러한 요소가 많으면 메모리가 문제가 될 수 있습니다. List<Integer>을 압축하여 int[]으로 압축 한 서드 파티 라이브러리를 사용하거나 프리미티브 용 배열을 사용하는 것이 좋습니다. Java가 값 유형을 지원하지 않는다는 것은 불행한 일입니다.

7

Arrays.asList(new int[] { 1, 2, 3, 4, 5 })List<int[]>을 하나의 항목으로 만들고 List<Integer> 개의 항목을 만들지 않기 때문입니다.

참고 그러나 이것은 당신이 무엇을 기대 할 것이라고 :

List<Integer> intsList = Arrays.asList(1, 2, 3, 4, 5); 

귀하의 다른 대안

은 다음과 같습니다

  • 가 처음에 Integer[]을 만들거나
  • 은 당신의 목록을 채우는 루프
+0

예, 시도해 보았지만 작동하지 만 정수 []는 백만 개입니까? – arynaq

+0

@arynaq 그러면 두 가지 옵션은'int []'대신'Integer []'를 만들거나리스트를 루프로 채우는 것입니다. – assylias

3

이 방법은 다음과 같이 정의됩니다. public static <T> List<T> asList(T... a)

첫 번째 경우에 Tint[]이고 단일 개체를 메서드에 전달하고 있습니다 (예 : 배열), 따라서 int[]의 목록을 반환합니다.

난 당신이 int가 아닌 java.lang.Object의 일부 하위 유형이어야합니다 List<T>asList(1, 2, 3, 4, 5) (즉, 5 개 항목)

+0

정확히 맞습니다. +1 기억하십시오. Java에서는 원하는 경우 T 유형의 항목이있는 가변 개수의 항목 인 인수가있는 메소드를 호출 할 수 있습니다. 그것이 서명이 중요한 이유입니다. –

+0

Java에는'int'의'List'가 없습니다. –

+0

오타. 결정된. 감사. – mprivat