2014-03-27 111 views
3

我有一些類。Java靜態函數

class A{  
    static void v(){ 
     System.out.println("A"); 
    } 
} 

class A1 extends A{ 
    static void v(){ 
     System.out.println("A1"); 
    } 
} 

class B <T extends A>{ 
    void v(){ 
     T.v(); 
    } 
} 

爲什麼下面的代碼輸出「A」?

B b = new B<A1>(); 
b.v(); 

我認爲代碼應該輸出「A1」,因爲B<A1>()

+2

'T extends A' < - Right there – Brian

+3

爲什麼要輸出別的東西? – Maroun

+0

我以爲代碼應該輸出「A1」,因爲B () –

回答

3

T.v()static方法調用,並編譯成A.v()因爲T根據約束它的上型擦除到A

0

靜態方法不能動態地調度。要調用的確切方法在編譯時解析,並且由於擦除而爲A。

0

這裏的問題是,對靜態方法的調用靜態綁定在編譯時間到變量的聲明類型。在這種情況下,編譯器知道TA

本地對象的通用類型是A1 - 在B內進行綁定並不重要,其中A是編譯器對類型的唯一信息。

0

您沒有覆蓋類T的函數v()。由於T是A的子類,因此調用T.v()的效果等於輸出「A」的A.v()。