2013-10-02 12 views
8

Ovviamente, questo si traduce in un errore di compilazione in quanto presidente non è legato alla Cat:Java: Casting una classe a un'interfaccia non correlato

class Chair {} 
class Cat {} 

class Test { 
    public static void main(String[] args) { 
     Chair chair = new Char(); Cat cat = new Cat(); 
     chair = (Chair)cat; //compile error 
    } 
} 

Perché è allora, che io ho soltanto un'eccezione in fase di esecuzione in cui Ho lanciato un riferimento Cat all'interfaccia Mobile non collegata, mentre il compilatore può ovviamente dire che Cat non implementa Furniture?

interface Furniture {} 

class Test { 
    public static void main(String[] args) { 
     Furniture f; Cat cat = new Cat(); 
     f = (Furniture)cat; //runtime error 
    } 
} 
+0

perché il polimorfismo si verifica in fase di esecuzione. –

+0

ma il compilatore sa che Cat non implementa Furniture e che non può cambiare in fase di esecuzione? Potrei mancare un punto semplice, ma la tua risposta non mi aiuta veramente – enp4yne

+0

Perché. Anche se Cat non è in grado di implementare direttamente i mobili, può far parte una superclasse di Cat. E il compilatore sceglie di non scavare in dettagli così brutti, dal momento che le regole per le interfacce sono piuttosto complicate. (Grazie, Sun.) E non esiste una regola generale * che richiede * al compilatore di rilevare un'eccezione di runtime inevitabile (come dividere per zero) - è più di un "servizio" che fornisce. –

risposta

12

Il motivo di questa compila

interface Furniture {} 

class Test { 
    public static void main(String[] args) { 
     Furniture f; Cat cat = new Cat(); 
     f = (Furniture)cat; //runtime error 
    } 
} 

è che si può benissimo avere

public class CatFurniture extends Cat implements Furniture {} 

Se si crea un'istanza CatFurniture, è possibile assegnarlo a Cat cat e tale istanza può essere castato a Furniture. In altre parole, è possibile che alcuni sottotipo Cat implementino l'interfaccia Furniture.

Nel tuo primo esempio

class Test { 
    public static void main(String[] args) { 
     Chair chair = new Char(); Cat cat = new Cat(); 
     chair = (Chair)cat; //compile error 
    } 
} 

è impossibile che qualche Cat sottotipo estende Chair meno Cat si estende da Chair.

+4

È utile notare che se 'Cat' fosse dichiarato' final', il compilatore si sarebbe infatti lamentato (avrebbe saputo che nessuna sottoclasse di 'Cat' poteva implementare' Furniture' dal non ci potrebbe essere sottoclasse di 'Cat'). –