2014-01-14 3 views
0

이중 배열 doubleArray1이 있습니다. 그것은 아무것도 인쇄되지 않습니다Arrays.asList(). contains() on Double 배열과 double 배열

double doubleArray1 [] = {1D,2D,3D}; 
if(Arrays.asList(doubleArray1).contains(1D)) { 
    System.out.println("hello-1"); 
} 

아래와 같이 나는 Arrays.asList().contains() 작업을 시도했다. 그리고 나는 그것은 hello-1를 인쇄

Double doubleArray1 [] = {1D,2D,3D};   
if(Arrays.asList(doubleArray1).contains(1D)) { 
    System.out.println("hello-1"); 
} 

더블 배열했다.

누군가이 차이를 설명 할 수 있습니까?

답변

8

Arrays.asList에 대한 귀하의 첫 번째 호출은 실제로 List<double[]>를 반환는 - double[]T[]하지 않기 때문에이 인수를 오토 박싱있다 ... 제네릭 형식 인수로 원시 타입을 허용하지 않습니다.

double[]List<Double>으로 변환하려면 수동으로 수행하거나 제 3 자 라이브러리를 사용해야합니다. 예를 들면 :

Arrays.asList 달리 배열에 대한 후속 변경이 하지이 목록 또는 반대에 반영됩니다
public List<Double> toList(double[] doubles) { 
    List<Double> list = new ArrayList<>(doubles.length); 
    for (double x : doubles) { 
     list.add(x); 
    } 
    return list; 
} 

주 -이 사본이 아닌 뷰입니다.

0

일반은 기본 유형이 아닌 클래스 유형을 사용할 수 있습니다. 따라서 이것을 프리미티브와 비교해 보았을 때 당신이 원하는 바를주지는 못했지만 클래스 유형은 당신에게 결과를줍니다.

0

Jon의 답변에 추가하려면 : asList은 vararg (가변 arity) 매개 변수 목록을 사용하고 vararg 매개 변수는 예상 한대로 자동 저장하지 않습니다. 제네릭을 포함하지 않는 간단한 경우 :

public void foo(Double... x) { whatever } 

double[] doubleArray1 = {1D,2D,3D}; 

foo(doubleArray1); // error 

오류 argument type double[] does not conform to vararg element type Double을 제공합니다. asList에도 동일하게 적용됩니다. 여기서 일어나는 일은 Arrays.asList이 일반적이고 명시 적으로 제네릭 유형을 지정하지 않았기 때문에 어떤 작품이든 선택할 것입니다. Double이 작동하지 않습니다 (동일한 이유로 foo 호출이 컴파일되지 않음). double[]이 작동합니다. 명시 적으로 generic 매개 변수를 제공하는이 표현식은 컴파일시 동일한 오류를 줄 것입니다.

Arrays.<Double>asList(doubleArray1).contains(1D)