Originariamente inviato da ragnonerodocet
devo effettuare certamente un casting, dato che il metodo next() della classe Iterator restituisce un Object, ma com'e' possibile che a run time la JVM si accorga del reale tipo dell'oggetto se il metodo e' eseguito su una variabile di tipo PricedItem???
No alt. Ogni oggetto a runtime mantiene una informazione precisa e completa sul suo tipo (a parte i tipi parametrici dei generics, per via della "erasure" ... ma è un altro discorso).

next() ha come tipo statico di ritorno un Object ... non vuol dire che l'oggetto restituito è davvero di tipo Object. Sicuramente "è-un" Object, cioè deriva da Object.

Nella riga:

item = (PricedItem)it.next();

c'è un "down-cast" che è quindi soggetto ad un controllo a runtime da parte della JVM.

Se l'oggetto restituito da next() è realmente un Book, allora la JVM "sa" che è un PricedItem, quindi il cast ha successo. Se l'oggetto non è un PricedItem, allora la JVM lancia ClassCastException.