2011-11-14 2 views
3
ArrayList<Integer> arrI = new ArrayList<Integer>(); 
ArrayList arrO = arrI; // Warning 
/* It is ok to add a String as it is an ArrayList of Objects 
    but the JVM will know the real type, arrO is an arrayList of 
    Integer... 
*/ 
arrO.add("Hello"); 
/* How I can get a String in an ArrayList<Integer> ?? 
    Even if the compiler told me that I will get an Integer! 
*/ 
System.out.println(arrI.get(0)); 

아무도 여기서 무슨 일이 일어 났는지 설명 할 수 있습니까?Generics Type 문제

+0

경고를 읽고 이해 했습니까? 경고는이 코드를 작성함으로써 arrI에 대한 모든 컴파일 시간 유형 검사를 건너 뜁니다. – DJClayworth

+0

@DJClayworth ok,하지만 마지막 줄은 정말 이상합니다. – JohnJohnGa

답변

3

제네릭은 삭제 유형을 통해 구현되기 때문에 실제 유형을 알지 못합니다. 제네릭 정보가 손실되는 런타임시

ArrayList arrI = new ArrayList(); 
ArrayList arrO = arrI; 
arrO.add("Hello"); 
System.out.println(arrI.get(0)); 
3

type erasure 때문에 런타임에 제네릭이 존재하지 않습니다. 실제로 그것은 당신의 arraylist가 어떤 유형의 물체도 휴대 할 수 있음을 의미합니다. Generics는 컴파일러가 일부 코드의 정확성을 확인할 수있게 해주는 프로그래머 편의입니다.

2

: 바이트 코드 (따라서 런타임 행동)의 관점에서

, 당신의 코드는 동일합니다. 컴파일시에만 오류를 방지합니다.

arr1.add ("Hello")를 시도해보십시오. arr1이 ArrayList로 선언 되었기 때문에 컴파일 타임에 오류가 발생하지만 런타임에 arr0에 arr1을 할당 할 수 있으므로 허용해야합니다.