Java의 제네릭은 모든 ClassCastexceptins를 피합니까?
-
16-09-2019 - |
문제
제네릭은 Java 5와 함께 컴파일 시간 동안 만 확인되므로 모든 상황에서 클래스 캐스트 외과를 피할 수 있습니까?
해결책
우선, 코드가 관리되지 않은 경고없이 컴파일되도록해야합니다. 그것은 좋은 지표입니다. 이유를 이해하려면 효과적인 Java의 제네릭에 대한 샘플 장.
둘째, 제네릭은 다음과 같은 코드로부터 당신을 보호 할 수 없습니다.
public void methodOne(Integer argument) {
methodTwo(argument);
}
public void methodTwo(Object argument) {
System.out.println(((Date) argument).getTime());
}
셋째, 당신이 어떤 식 으로든 클래스 로더를 혼란스럽게한다면, 당신은 이상해 질 수 있습니다. ClassCastExceptions
, 이 토론 스레드. 보는 것은 마음의 마음입니다
java.lang.classcastException : javax.mail.session은 javax.mail.session으로 캐스트 할 수 없습니다
그래서 대답은입니다 아니, 당신은 제거 할 수 없습니다 ClassCastException
제네릭을 올바르게 사용하여 s.
다른 팁
Java 5 Generics가 제공하는 "주철"보증은 컴파일러가 삽입 한 캐스트에서 ClassCastException을 절대 볼 수 없다는 것입니다. 제공 그 편집은 "확인되지 않은"경고가 없었습니다.
실제로 코드가 레거시 (Generified) 라이브러리를 사용하는 경우 점검되지 않은 경고를 피할 수 없습니다. 그런 다음 컴파일러 생성 캐스트 ~할 수 있다 ClassCastException을 던지면 라이브러리 코드로 반환 된 값이 선언에 적합한 지 확인하여이를 방지하는 것이 귀하의 작업입니다.
그렇지 않으면 상황이 변경되지 않습니다. 제네릭 이외의 외에는 양립 할 수없는 유형으로 캐스트되면 항상했던 것과 같은 방식으로 클래스 캐스트 외환을 얻을 수 있습니다.
(이것 및 기타 제네릭 질문에 대한 좋은 참조는 자바 제네릭 및 컬렉션.)
아니요. Java 5.0 및 Generics 유형을 사용해도 ClassCastException을 제공하지는 않습니다.
아니요. 제네릭은 런타임 예외가 아닌 컴파일 타임 오류에서만 절약 할 수 있습니다.