2013-10-02 14 views
8

Oczywiście skutkuje to błąd kompilacji, ponieważ przewodniczący nie jest związana z cat:Java: Casting klasę niepowiązanych interfejsu

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

Dlaczego go wtedy, że mogę jedynie wyjątek w czasie wykonywania, gdy Rzucam odnośnik Cat do niepowiązanego ze sobą interfejsu mebli, podczas gdy kompilator może oczywiście powiedzieć, że Cat nie implementuje mebli?

interface Furniture {} 

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

ponieważ polimorfizm występuje w czasie wykonywania. –

+0

, ale kompilator wie, że Cat nie implementuje mebli i nie może się zmienić w czasie wykonywania? Być może brakuje mi prostego punktu, ale twoja odpowiedź tak naprawdę nie pomaga – enp4yne

+0

Ponieważ. Mimo że Cat nie może bezpośrednio implementować Meble, może to być nadklasa kota. Kompilator decyduje się nie zagłębiać w tak brzydkie szczegóły, ponieważ zasady dotyczące interfejsów są dość zawiłe. (Dziękuję, Sun.) I nie ma ogólnej zasady * wymagającej * kompilatora do wykrycia nieuniknionego wyjątku środowiska wykonawczego (takiego jak dzielenie przez zero) - jest to raczej "usługa", którą zapewnia. –

Odpowiedz

12

Powodem tego kompiluje

interface Furniture {} 

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

jest to, że można bardzo dobrze mieć

public class CatFurniture extends Cat implements Furniture {} 

Jeśli utworzyć instancję CatFurniture, można przypisać go do Cat cat i że instancja może być rzucone do Furniture. Innymi słowy, jest możliwe, że niektóre podtypy Cat implementują interfejs Furniture.

W pierwszym przykładzie

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

, że to niemożliwe, że niektóre Cat podtyp rozciąga Chair chyba Cat sama biegnie od Chair.

+4

Warto zauważyć, że jeśli 'Cat' zostałby zadeklarowany jako" final ", kompilator istotnie narzekałby (wiedziałby, że żadna podklasa' Cat' nie może zaimplementować 'Furniture' nie może być podklasy "Cat"). –