2013-02-03 48 views
0

考慮下面的Java類:爲什麼編譯器在進行「壞」轉換時不會發生錯誤?

public class Animal { 
    public static void printText(Object obj) { 
     System.out.println(obj.toString()); 
    } 
} 

class Tiger extends Animal { 
    // Contains some unimportant methods. 
} 

而現在,當以下鍵入到的主要方法,編譯器不會給任何錯誤,即使是投會導致錯誤。爲什麼?

public static void main(String[] args) { 
    Animal animal = new Animal(); 
    ((Tiger)animal).printText(animal); // <= ?? no error in the compiler ?? 
} 
+0

引發了異常。編譯器錯誤已打印。不要混淆你自己。 – EJP

回答

3

在您的示例中,可能很容易知道演員陣容是錯誤的 - 但在一般情況下並非如此。

如果您有一個方法Animal getRandomAnimal(),該方法也可能返回Tiger。 (或者更常見的情況,方法Animal getAnimal()可能被子類重寫以返回Tiger)。

在編譯時,你不可能知道

Tiger tiger = (Tiger)getRandomAnimal(); 

是有效還是無效,這只是在運行時聞名。

1

因爲通常在編譯時無法檢測到。例如:

Animal a = (someCondition) ? new Animal() : new Tiger(); 

((Tiger)animal).printText(animal); 
相關問題