2009-08-12 2 views
1

관련왜 반환 값에 액세스 할 때 ClassCastException 만 throw됩니까?

이 함수가 주어진 경우 :

public static <S extends CharSequence> S foo(S s) { 
    return (S) new StringBuilder(s); 
} 

왜이 호출이 예외없이 실행됩니까?

foo("hello"); 

그러나이 클래스는 ClassCastException을 던집니까?

System.out.println(foo("hello")); 
+0

컴파일러에서 경고를주지 않았습니까 ?? –

+0

그것은 메소드에서 경고했지만 두 호출 모두에 대해서는 경고하지 않습니다. 하나의 호출이 작동하고 다른 호출이 예외를 던진 이유에 대해 궁금합니다. – Brabster

답변

6

제네릭을 무시 5/6은 제네릭 형식 그냥 Object 유형은 근본적 것을 의미한다 (또는 적어도 공통 분모 유형이 경우 CharSequence을에있는 무엇이든)하는 type-erased입니다 런타임에. 필요할 때마다 적절한 형변환을 삽입합니다. 그래서 방법은 다음과 같습니다 뭔가-삭제 입력 가져옵니다

public static CharSequence foo(CharSequence s) { 
    return (CharSequence) new StringBuilder(s); 
} 

그리고 전화는이에-삭제 입력 가져옵니다

System.out.println((String)foo("hello")); 

경우 생성 분명히 자바가 (String) 캐스트를 삽입 귀찮게하지 않습니다 반환 값은 사용되지 않습니다 - 왜 귀찮게합니까?

3

일반 유형은 컴파일러에서만 사용할 수 있으며 런타임에 지워집니다 (기본적으로 생략 됨). 그래서 캐스트가 자바에서 메서드 내에서

관련 문제