2016-01-27 106 views
1

有三個類別,ChildChild,ChildParent一個延伸另一個。我爲大多數外部類調用使用模板的方法,並且我想調用方法doSomething來打印「CHILD」。而不是先前的方法被調用。呼叫超載方法使用模板

class Test { 
    public <T extends Parent> void doSomething(T input) { 
     System.out.println("PARENT"); 
    } 
    public <T extends Child> void doSomething(T input) { 
     System.out.println("CHILD"); 
    } 

    public <T extends Parent> void run(T input) { doSomething(input); } 
} 

class Main { 
    public static void main(String[] args) { 
     Test t = new Test(); 
     t.run(new ChildChild()); 
    } 
} 

是因爲方法只爲父類定義模板嗎?

回答

2

是,當編譯器擦除泛型類型參數,它們是由它們的類型範圍更換,所以你run方法變爲:

public void run(Parent input) { doSomething(input); } 

和重載的方法變成:

public void doSomething(Parent input) { 
    System.out.println("PARENT"); 
} 
public void doSomething(Child input) { 
    System.out.println("CHILD"); 
} 

因此調用doSomething(Parent input)(記住,在編譯時使用編譯時類型確定方法重載分辨率),而不考慮您傳遞給run的實例的運行時類型OD。