2016-06-06 3 views
1

나는 그냥 OCA-도서 (오라클 공인 부교수)에서 읽은 그 :java.lang.ClassCastException가 또는 컴파일 시간

"일부 예외는 컴파일시 오류로 검출 할 수 캐스트, 그러나 다른 것들은 런타임시에만 탐지 될 수 있습니다. "

이제는 컴파일 타임과 런타임 모두에 대한 예제를 찾으려고합니다. 이

Object o = new C(); 
B b = (B) o; 

가 올 캐스트 다음

class A {} 

class B extends A {} 

class C extends B {} 

:

는 다음과 같은 클래스 구조를 생각해 보자. 따라서 코드는 ClassCastException없이 실행됩니다.

캐스트

Object o = new B(); 
C c = (C) o; 

은 잘못된 것입니다. Object o은 적어도 B 유형입니다. 따라서 B 또는 A으로 전송할 수 있습니다.

그러나 이것이 런타임이나 컴파일 타임에 감지 될 수 있습니까? 나는 컴파일 타임에 추측하겠습니까?! 또는 컴파일러는 참조 (메모리) 자체가 아닌 참조의 형식 만 알고 있습니까? 이것이 사실이라면 컴파일러는 캐스트가 올바른지 컴파일 타임에 결정할 수 없습니다.

도움 주셔서 감사합니다.

+0

:

하지만 이것은 컴파일시 실패? – SMA

+1

당신은 그것을 시험해 볼 수 있습니다 - 작은 프로그램을 작성하고, 컴파일을 시도하고, 컴파일러가 오류를 일으키는 지 확인하십시오; 컴파일하면'ClassCastException'가 있는지 확인하고 실행 해보십시오. – Jesper

답변

4

컴파일러는 객체 자체가 아니라 참조 유형 만 알고 있습니까?

캐스팅하려는 표현 유형만 알고 있습니다. 이 표현식은 Object 유형이므로 컴파일러와 관련해서는 C에 캐스트하는 것이 좋습니다. 언어 이 컴파일 타임에 잡힐 수 있도록 고안되었지만 컴파일러가 추론해야하는 정확한 의미를 파악하고 추측 할 수없는 내용이 털이 ... 실제로는 ' 어떤 코드는 컴파일러가 허용하고 일부하지 않습니다. 어떻게 사전에 객체의 유형을 알고 컴파일러 것이다 그것은 런타임 것

String s = ""; 
C c = (C) s; // Can't possibly be true