벡터 요소를 인쇄하려고 할 때이 이상한 캐릭터를 얻습니다!
-
22-07-2019 - |
문제
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"로 끝나야하기 때문에 여전히 이상하게 보입니다.