2016-06-06 5 views
1

Я только что прочитал в ОСА-Book (Oracle Certified Associate), что:java.lang.ClassCastException во время выполнения или во время компиляции

«Некоторые проливает исключения могут быть обнаружены как ошибки во время компиляции, но другие могут быть обнаружены только во время выполнения ».

Теперь я пытаюсь найти пример для обоих случаев: время компиляции и время выполнения.

Рассмотрим следующую структуру класса:

class A {} 

class B extends A {} 

class C extends B {} 

Следующие ввергнуть

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

правильно. Таким образом, код будет работать без ClassCastException.

Актерский

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

неправильно. Объект o является, по меньшей мере, типом B; поэтому его можно было бы отличить до B или A.

Но может быть это обнаружено во время выполнения или времени компиляции? Я бы догадался, во время компиляции ?! Или компилятор знает только тип ссылки, а не самого объекта (в памяти)? Если это так, компилятор не может решить, правильно ли выполняется трансляция или нет во время компиляции.

Благодарим за помощь!

+0

Было бы во время выполнения, как компилятор будет знать тип объекта заранее? – SMA

+1

Вы можете просто попробовать - напишите небольшую программу, попробуйте ее скомпилировать, посмотрите, дает ли компилятор вам сообщение об ошибке; если он компилируется, попробуйте запустить его и посмотреть, есть ли у вас «ClassCastException». – Jesper

ответ

4

Или компилятор знает только тип ссылки, а не объекта (в памяти)?

Он знает только тип выражения, которое вы пытаетесь выполнить. Это выражение имеет тип Object, поэтому его отличает его от C в отношении компилятора. В то время как язык мог был разработан, чтобы позволить этой ошибке быть пойманным во время компиляции, закрепляя точную семантику того, что должен сделать компилятор, и то, что он не может сделать, было бы волосатым ... и вы действительно не знаете, t хотите код некоторые компиляторы разрешить и некоторые нет.

Это потерпит неудачу во время компиляции, хотя:

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