2015-02-11 90 views
1

比方說,我已經叫一個抽象類,它有這個抽象方法方法聲明中通用

removeItem(GeneralItem item, String reason); 

但隨後在子類中我有

removeItem(SpecificItemThatExtendsGeneralItem item, String reason){ //code } 

我如何使它所以第二的removeItem算作第一個的執行?例如

removeItem(<? extends GeneralItem> item, String reason); 
+2

如果將它傳遞給OtherSpecificItemThatExtendsGeneralItem會發生什麼? – immibis 2015-02-11 20:48:19

+0

這絕不會發生 – 2015-02-11 20:53:14

+0

但是,如果其他人編寫該代碼並實現它,該怎麼辦? – immibis 2015-02-11 20:53:53

回答

2

具有方法簽名......

removeItem(SpecificItemThatExtendsGeneralItem item, String reason) 

... 實現...因爲後者可以接受任何,包括那些不是SpecificItemThatExtendsGeneralItem

如果你可以改變抽象類,但是,那麼你可以把它可能:

abstract class MyAbstractClass <T extends GeneralItem> { 
    abstract public void removeItem(T item, String reason); 
} 

class MySubclass extends MyAbstractClass<SpecificItemThatExtendsGeneralItem> { 
    @Override 
    public void removeItem(SpecificItemThatExtendsGeneralItem item, 
      String reason) { 
     // ... 
    } 
} 

在這種情況下,但是,請注意,類型MySubclass然後仍然不符合MyAbstractClass<GeneralItem>

MyAbstractClass<GeneralItem> = new MySubclass(); // ERROR 

雖然它是MyAbstractClass<?>MyAbstractClass<SpecificItemThatExtendsGeneralItem>兼容:

MyAbstractClass<?> c = new MySubclass(); // ok 
MyAbstractClass<SpecificItemThatExtendsGeneralItem> = new MySubclass(); // ok 
+0

很好的解釋。 – StuPointerException 2015-02-11 21:15:39

0

子類不能改變它們在方法中接受的類型。但是你絕對可以檢查類型是你所期望的:

removeItem(GeneralItem item, String reason) 
{ 
    if (!(item instanceof SpecificItemThatExtendsGeneralItem)) 
     throw InvalidArgumentException("Only SpecificItemThatExtendsGeneralItem accepted"); 
} 

然而,這不會在編譯時檢查,僅僅是因爲當有人打電話

abstractClassInstance.removeItem(OtherSpecificItemThatExtendsGeneralItem) 

編譯器沒辦法知道這應該失敗,它不知道哪個實現abstractClassInstance實際上是。

0

這是不可能的。

的方法:

removeItem(SpecificItemThatExtendsGeneralItem item, String reason){ //code } 

不包括打電話,你希望它覆蓋的方法的所有有效途徑。因此,有一個類(僅)實現此方法不會實現父類的合同。

1

如果你可以改變的基類,可以概括第一個參數:

class BaseClass<T extends GeneralItem> { 
    void removeItem(T item, String reason) { 
    } 
} 

class SubClass extends BaseClass<SpecificItemThatExtendsGeneralItem> { 
    @Override 
    void removeItem(SpecificItemThatExtendsGeneralItem item, String reason) { 
    } 
}