Di seguito posto il codice che mi ha annichilito...

codice:
public interface PricedItem {  
   public void setPrice(double price);  
   public double getPrice();  
} 

L'interfaccia PricedItem definisce il comportamento di un articolo con prezzo. Possiamo a questo punto implementare l'interfaccia in una classe applicativa Book nel modo seguente  

  public class Book implements PricedItem {  
        private String title;  
        private String author;  
        private double price;  
        ...  
        public void setPrice(double price) {  
            this.price = price;  
        }  

        public double getPrice() {  
            return price;  
        }  
    }  



Il codice client che necessita del prezzo di un libro può quindi essere scritto così:  

    double computeTotalPrice(Collection items) {  
        Iterator it = items.iterator();  
        PricedItem item;  
        double total = 0;  

        while (it.hasNext()) {  
            item = (PricedItem)it.next();  
            total += item.getPrice();  
        }  
        return total;  
    }
La mia domanda e' questa:

nella riga

total += item.getPrice();

come diamine faccio a chiamare un metodo di un'interfaccia???

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???