[英]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.