簡體   English   中英

如何正確實現嵌套泛型?

[英]How to correctly implement nested generics?

我在一個類型為List<List<Value>>的類上有一個屬性,並且我試圖用一個類實例化它,這些類是這些接口和類的子類型,如下所示:

public List<List<Value>> rows = new DbRowList<MyRow>();

其中DbRowList是擴展ArrayList的類型:

public class DbRowList<E extends List<Value>> extends ArrayList<E> implements List<E> {

    public boolean add(E element) {
        MyRow row = new MyRow();
        return super.add(row); // Compile-time error
    }
}

MyRow是:

public class MyRow extends ArrayList<Value> implements List<Value> {
    public Table table;
}

但是由於DbRowList.add()的return語句中存在錯誤,因此無法編譯:

The method add(E) in the type ArrayList<E> is not applicable for the arguments (MyRow)

為什么不適用? MyRow擴展了ArrayList<Value>本身是一個List

您的錯誤消息是不言自明的:編譯器希望將類型E的參數傳遞給super.add() 您的代碼將覆蓋 add()方法,因此必須通過傳遞E類型的對象來跟從。 因此,您的代碼應如下所示:

public boolean add(E element) {
    return super.add(E); // no error here
}

如果您想知道如何使用類,只需在外部創建MyRow對象並將其傳遞:

List<List<Value>> rows = new DbRowList<MyRow>();
MyRow row = new MyRow();
rows.add(row);

首先,您不需要所有這些“ implements List<E> ”,因為ArrayList本身實現了List

關於您的編譯錯誤,因此使用和理解泛型都是錯誤的。 當您為DbRowList類的實例指定此類型變量時,您將能夠添加特定類的特定實例,因此這段代碼將編譯並起作用:

public boolean add(E element) {
    return super.add(element); 
}

public static void main(String[] args) {
    new DbRowList<MyRow>().add(new MyRow());
}

但是,如果要強制編譯示例,則始終可以強制轉換為泛型類型E ,因為泛型在運行時不存在,並且列表可以包含任何類型的實例:

public boolean add(E element) {
    MyRow row = new MyRow();
    return super.add((E) row);
}

你為什么要這樣做?

您重寫方法以添加空的arrayList而不是實際參數值。 元素未傳遞到任何地方。

原因很簡單:您嘗試將其傳遞給想要的super.add

E

但是你通過了

ArrayList<E>.

您應該做的就是不重寫方法,而是正確定義類:

public class DbRowList<E extends List<Value>> extends ArrayList<E>{

}

void testMethod(){
    List<List<Value>> rows = new DbRowList<>();
    rows.add(new ArrayList<>());
}

編輯:實際上,在鍵入時,我知道這並不是您想要的,所以請澄清一下:您是否需要保存行或將元素保存到指定的行? 我描述的是保存整個行,但是您可能需要的是指向行的映射。 然后,您可以將元素添加到指定的行,而無需創建新行或加載/搜索所需的行。

暫無
暫無

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

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