2014-01-05 51 views
5

根據子類的類型,是否可以動態地將T標識爲返回類型? 我想類似如下:根據子類定義泛型類的父類方法Java中的類型

public class Parent { 
     public <T extends Parent> T foo() { 
       return (T)this; 
     } 
} 

public class Child extends Parent { 
     public void childMethod() { 
       System.out.println("childMethod called"); 
     } 
} 

然後打電話:

Child child = new Child(); 
child.foo().childMethod(); 

沒有定義,像這樣類型:提前

Child child = new Child(); 
child.foo().<Child>childMethod(); // compiles fine 

謝謝!

+0

'Child extends Parent',right? – ericbn

+0

應該'Child'擴展'Parent'嗎? – Bohemian

+0

對,我編輯了代碼。謝謝! :) – chaplean

回答

3

你想這樣的:

public class Parent<T extends Parent<T>> { 
    public T foo() { 
     return (T)this; 
    } 
} 

public class Child extends Parent<Child> { 
    public void childMethod() { 
     System.out.println("childMethod called"); 
    } 
} 

Child child = new Child(); 
child.foo().childMethod(); // compiles 
+0

simpler:public class Parent {}, class Child extends Parent {} and main:Parent instance = new Parent <>(); – solvator

+1

@solvator號你的代碼導致在一個原始類型'父'在綁定,這是非常不可取的 – Bohemian

+0

啊,是啊,沒有注意到..它會工作,如果不會繼承 – solvator

0

它在Java類型系統Parent指確切類的this是不可能的。然而,它可以有一個類型參數(說T),子類可以指定它們自己或其他類型(無論他們想要什麼),並使用抽象方法將獲取該類型實例的任務委派給T子類。

public abstract class Parent<T> { 
    // the implementer is responsible for how to get an instance of T 
    public abstract T getT(); 
    // in this case, foo() is kind of redundant 
    public T foo() { 
     return getT(); 
    } 
} 

public class Child extends Parent<Child> { 
    public Child getT() { 
     return this; 
    } 
    public void childMethod() { 
     System.out.println("childMethod called"); 
    } 
} 

Child child = new Child(); 
child.foo().childMethod(); // compiles