문제

NetBeans를 사용하고 있습니다. 아래 프로그램을 실행할 때이를 출력으로 얻습니다. [I@de6ced! 어떻게 되나요?

import java.util.Arrays;
import java.util.Vector;

public class Test {

public static void main (String[] args) {
     int[] a = new int[1];
     a[0] = 5;
     Vector<Integer> a1 = new Vector(Arrays.asList(a));
     System.out.println(a1.elementAt(0));
 }
}

나는 또한 그 주위에서 일을 시도했지만 나는

스레드의 예외 "main"java.lang.classcastException : [나는 topcoder.test.main에서 java.lang.integer에 캐스트 할 수 없습니다 (test.java:13) Java 결과 : 1

public static void main (String[] args) {
    int[] a = new int[1];
    a[0] = 5;
    Vector<Integer> a1 = new Vector(Arrays.asList(a));

    int b = a1.elementAt(0); /* EXCEPTION THROWN HERE */
    System.out.println(b);
}
도움이 되었습니까?

해결책

Integer[] a = new Integer[1];
a[0] = new Integer(5);
List list = Arrays.asList(a);
System.out.println(list.get(0));

위의는 예상대로 작동합니다.

따라서 "int"배열은 정수 배열이 아닌 물체처럼 취급되는 것처럼 보입니다. 다시 말해서 자동 권투가 적용되지 않는 것 같습니다.

다른 팁

[I@de6ced 다음과 같이 분류 할 수 있습니다.
- [ 배열
- I 정수의
- de6ced 이것으로 참조 해시 코드 (Sun Java에서는 기본적으로 참조입니다)

객체에 대한 tostring ()는 classname@hashcode와 같은 somethine을 반환합니다. 이것은 당신이보고있는 것과 정확히 일치합니다.

문제는 잘못된 유형이 <T> List<T> asList(T...) 방법. 사용할 코드를 변경하십시오 Integer[] 대신에 int[]. 이것은 int가 원시적이지만 int []는 객체입니다.

이것을 직접 볼 수 있습니다 :

System.out.println(Arrays.asList(new int[]{5}));

=> [[I@일부 참조

System.out.println(Arrays.asList(new Integer[]{5}).get(0));

=> 5

나는 무슨 일이 일어나고 있는지 알아 낸 것 같아요.

 int[] a = new int[1];
 a[0] = 5;

이제 int 배열이 있습니다.

 Vector<Integer> a1 = new Vector(Arrays.asList(a));

문제는 당신이 전화하는 방식에 관한 것입니다 Arrays.asList.

Aslist의 서명은 "public static <T> List<T> asList(T... a)". 그것은 적용되지 않습니다 T == int 왜냐하면 int 객체 유형이 아닙니다. 그리고 그것은 일치 할 수 없습니다 T == Integer 배열의 기본 유형이기 때문입니다 a ~이다 int ~ 아니다 Integer. 실제로 일어나고있는 것은 그 것입니다 T 구속력이 있습니다 int[], 그리고 Arrays.aslist(a) 돌아오고 있습니다 List<int[]> 값의 하나의 요소가 있습니다 a!!!

그런 다음 a를 만듭니다 Vector ~로부터 List 그리고 a Vector 하나의 요소로 ... 원본 int[] 그것은 'a'에 할당되었습니다.

 System.out.println(a1.elementAt(0));

드디어, a1.elementAt(0) 메신저를 가져옵니다 int[], 그리고 당신은 결국 전화하게됩니다 Object 의 구현 toString() 방법.

이것으로부터 배우는 몇 가지 중요한 교훈 :

  • 선언하는 라인에서와 같이 원시 유형과 일반 유형을 혼합하는 것은 나쁜 생각입니다. a1, 그리고
  • 컴파일러의 일반적인 유형 안전 경고를 무시하거나 끄는 것은 나쁜 생각입니다.

int가 오토 옥싱을 사용하여 정수가되어 값 대신 객체 참조를 얻는 것처럼 보입니다. 올바른 토스트 링을 부르고 "5"로 끝나야하기 때문에 여전히 이상하게 보입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top