2014-09-01 3 views
-1

메서드에서 중첩 된 제네릭을 사용할 때 경고가 표시되지 않습니다. 왜 그런가요? 중첩 된 제네릭에 검사되지 않은 경고가 표시되는 이유는 무엇입니까?

public static <T> T[] genericTest(T[] aa) { 
    return aa; 
} 

그래서 내가 왜이 첫 번째 코드 블록의 경고가 아닌 초를 얻고있다 : 나는 방법을 수정하는 경우

package test; 

public class subc { 

    public static void main(String[] args) { 
     Integer aa[] = new Integer[10]; 
     infunction(aa); 
     // Not Warning , Use genericTest !!!!!!!!!!! 
     Integer[] abc = genericTest(aa, aa.getClass()); 
     @SuppressWarnings("unused") 
     Integer a = abc[0]; 
    } 

    public static <T> T[] genericTest(T[] aa, Class<? extends T[]> class1) { 
     return aa; 
    } 

    public static <T> T[] infunction(T[] aa) { 
     // Warning, Use genericTest(unchecked) !!!!!!!!!! 
     T[] result = (T[]) genericTest(aa, aa.getClass()); 
     return result; 
    } 
} 

는 경고가 없다?

+0

왜 클래스 '를 확장합니까? 'Class '또는'class '('genericTest' 메쏘드에서)이라고 말할 수 있습니다. –

+0

그냥 테스트 코드, 그리고 내가 복사, Arrays.copyOf –

+0

public static T [] copyOf (U [] original, int newLength, Class newType) { T [] copy = (Object) newType == (Object) Object []. class) ? (T []) new Object [newLength] : (T []) Array.newInstance (newType.getComponentType(), newLength); System.arraycopy (원본, 0, 복사본, 0, Math.min (original.length, newLength)); 반품 사본; } 단순한 경우 만 바꿉니다. –

답변

0

체크되지 않은 캐스트는 명시 적으로 코드에 표시된 것으로 표시되는 (T[]) 캐스트입니다. T[]은 확인 가능한 유형이 아니므로 런타임시 캐스트가 완전히 검사되지 않습니다.

캐스트가없는 코드가 컴파일되지 않은 경우 캐스트를 추가했다고 추측합니다. 따라서 실제 질문은 T[] result = genericTest(aa, aa.getClass());이 컴파일되지 않는 이유입니다.

aa.getClass()Class<? extends Object[]>을 반환하기 때문입니다. .getClass() 메서드의 실제 컴파일 타임 반환 유형 (해당 설명서에 설명되어 있음)은 Class<? extends |X|>입니다. 여기서 |X|.getClass()이라는 정적 형식의 지우기입니다. 여기에서 aaObject[] 인 삭제 T[] 유형이므로 aa.getClass()Class<? extends Object[]>을 반환합니다. (내가 여기에 가지 않을 .getClass()의 반환 유형에 대한 이유.)

genericTest 이후 Class<? extends Object[]>, 유일하게 유효한 선택을위한을 입력하고 aa.getClass() '을 (T의 두 번째 매개 변수는 genericTest의 측면에서) Class<? extends T[]>을 입력있다' TgenericTest(aa, aa.getClass())의 경우 TObject입니다. 따라서 genericTest(aa, aa.getClass())Object[] 유형을 반환하며 T[]에 할당 할 수 없습니다.