ClassScastException이 반환 값에 액세스 할 때만 발생하는 이유는 무엇입니까?
-
13-09-2019 - |
문제
와 연관되다 이 질문
이 기능을 감안할 때 :
public static <S extends CharSequence> S foo(S s) {
return (S) new StringBuilder(s);
}
이 호출이 예외없이 실행되는 이유 :
foo("hello");
그러나 이것은 ClassCastException을 던지십니까?
System.out.println(foo("hello"));
해결책
Java 5/6의 제네릭은입니다 유형 기반, 이것은 모든 일반 유형이 근본적으로 단지 Object
유형 (또는 가장 일반적인 분모 유형은 무엇이든,이 경우 CharSequence
) 런타임에. 적절한 캐스트는 필요한 곳마다 삽입됩니다. 따라서 메소드는 다음과 같은 것처럼 보이는 것에 유형 기반을 얻습니다.
public static CharSequence foo(CharSequence s) {
return (CharSequence) new StringBuilder(s);
}
그리고 당신의 통화는 이것에 유형 기반을 얻습니다.
System.out.println((String)foo("hello"));
분명히 Java는 삽입하는 것을 귀찮게하지 않습니다 (String)
반환 값을 사용하지 않으면 캐스트 - 왜 귀찮게합니까?
다른 팁
일반 유형은 컴파일러에서만 사용할 수 있으며 런타임에 삭제 (기본적으로 생략)됩니다. 따라서 캐스트는 방법 내에서 무시됩니다
제휴하지 않습니다 StackOverflow