簡體   English   中英

方法聲明中的通用

[英]Generic within method declaration

假設我有一個抽象類,它有這個抽象方法

removeItem(GeneralItem item, String reason);

但后來我在一個子類中

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

我該怎么做才能使第二個removeItem算作第一個的實現? 例如

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

一種有簽名的方法......

removeItem(SpecificItemThatExtendsGeneralItem item, String reason)

...... 沒有實施......

removeItem(GeneralItem item, String reason)

...因為后者可以接受任何GeneralItem ,包括那些不是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

如果可以更改基類,則可以概括第一個參數:

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

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

子類不能更改它們在方法中接受的類型。 但你絕對可以檢查類型是否符合預期:

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

但是,在編譯期間不會檢查這一點,只是因為當有人打電話時

abstractClassInstance.removeItem(OtherSpecificItemThatExtendsGeneralItem)

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

這是不可能的。

方法:

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

並未涵蓋調用您希望覆蓋的方法的所有有效方法。 因此,擁有一個(只)實現此方法的類不符合父類的約定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM