2011-02-16 483 views
1

給出兩個抽象類,即AClass1和AClass2,其中第一個抽象類使用第二個作爲參數的抽象方法,您如何使用這些抽象類的子類來沒有Java抱怨未實現的抽象方法一起工作?具有抽象類參數的抽象方法的Java抽象類

public abstract class AClass1 { 
    ... 
    public abstract void aMethod(AClass2 param1, int param2, ...); 
    ... 
} 

public abstract class AClass2 { 
    ... 
} 

public class CClass1 extends AClass1 { 
    ... 
    public void aMethod(CClass2 param1, int param2, ...) { 
     ... 
    } 

public class CClass2 extends AClass2 { 
    ... 
} 

我認爲具體的類CClass1將是美好的,但Java不太願意,請求我實現public void aMethod(AClass ...)

我在做什麼錯?

回答

4

CClass1必須實現一種方法,可以採取任何AClass2,因爲您已經明確它會。您可以重載此方法,但必須實現父級的抽象方法。

1

你必須保持正確的簽名在你的具體類:

public abstract void aMethod(AClass2 param1, int param2, ...); 
0

的Java只支持covariant return types,不是協變參數類型。

如果不是這樣,假設你得到子類的實例,而是指它作爲抽象類:

AClass1 a = new CClass1(); 
AClass2 param = new AnotherCClass(); 
a.aMethod(param); // ClassCastException - can't cast AnotherCClass to CClass2 
+0

這個答案太可怕了。你不解釋什麼是「協變」的意思(我不知道它是什麼意思,而且我有一個CS博士),你不解釋爲什麼OP的問題有「協變參數類型」。此外,你給出了相當於一個邏輯謎題(「否則......」),這需要OP首先查找「協變」,然後將其應用於邏輯謎題,以找出代碼中的錯誤。連接到第一個谷歌結果的 – stackoverflowuser2010 2012-02-12 09:01:07

0

我知道這個問題是老了,但最近我有同樣的問題。

我到底做了什麼,我沒有定義抽象類,而是爲子類定義了一個接口。

這樣不幸的是你不能共享方法實現,但你可以爲它們設置一個模板,並且根據你的IDE,這些方法將爲你自動生成。