2011-06-23 202 views
14

我想創建一組子類重載超類的設置。這超有一個抽象方法 - 它的返回類型在理想情況下是從這種方法被調用的對象,使得其有效的行爲像這樣的:Java泛型 - 覆蓋抽象方法並具有子類的返回類型

public abstract class SuperClass{ 
    public abstract SuperClass getSelf(); 
} 

public class SubClass extends SuperClass{ 
    @Override 
    public SubClass getSelf(){ 
    return this; 
    } 
} 

我不能確定,如果這樣的事情是可能的,因爲我覺得回報類型總是要爲了使覆蓋工作一樣 - 但是我一直在想辦法,應該存在的,介於沿着這條線......

public abstract class SuperClass{ 
    public abstract <? extends SuperClass> getSelf(); 
} 

public class SubClass extends SuperClass{ 
    @Override 
    public SubClass getSelf(){ 
    return this; 
    } 
} 

感謝您的任何幫幫我。

編輯:添加擴展父類的子類,咄

+0

我不明白你將如何使用這個。你能舉個例子嗎? –

回答

7

這將工作:

public abstract class SuperClass{ 
    public abstract SuperClass getSelf(); 
} 

public class SubClass extends SuperClass{ 
    @Override 
    public SubClass getSelf(){ 
    return this; 
    } 
} 

通知我添加extends SuperClass您​​定義。返回類型getSelf被稱爲covariant return type

+0

啊,當然我忘了添加在示例中擴展SuperClass,雖然這當然存在於我的代碼中... 這就是說,我完全沒有意識到這已經工作了,謝謝! – Numeron

+1

這不適用於我:( – Carlos

4

如何:

public abstract class SuperClass<T extends SuperClass<?>> { 
    public abstract T getSelf(); 
} 

public class SubClass extends SuperClass<SubClass> { 
    public SubClass getSelf() { 
     return this; 
    } 
} 

我知道這很重複,沒有界定的類型是相同的​​實例,因爲還AnotherSubClass將滿足束縛,但至少它應該做的伎倆。

2

下面是如何做到這一點(由於JDK 1.5有這種稱爲協變返回類型的東西,在這種情況下可以這樣做)。

abstract class SuperClass<T extends SuperClass<T>>{ 
    public abstract T getSelf(); 
} 

class SubClass extends SuperClass<SubClass> { 
    public SubClass getSelf() { return this; } 
} 

public class Generics { 
    public static void main(String[] args) { 
    System.out.println(new SubClass().getSelf()); 
    } 
} 

通知與枚舉類似的類一般定義(http://download.oracle.com/javase/1,5.0/docs/api/java/lang/Enum.html)

看什麼會在幕後(通過使用javap的父類子類):

class SubClass extends SuperClass{ 
    SubClass(); 
    public SubClass getSelf(); 
    public SuperClass getSelf(); 
} 

abstract class SuperClass extends java.lang.Object{ 
    SuperClass(); 
    public abstract SuperClass getSelf(); 
} 

通知子類方法如何具有不同的返回類型,其是超級方法返回類型的子類型。

順便說一句,請注意,public SuperClass getSelf();類​​實際上是一個合成方法。

+0

結果!!!!!! +1 –