문제

제네릭은 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을 제공하지는 않습니다.

아니요. 제네릭은 런타임 예외가 아닌 컴파일 타임 오류에서만 절약 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top