Java 如何正确实现嵌套泛型?

Java 如何正确实现嵌套泛型?,java,generics,Java,Generics,我有一个属于列表类型的类的属性,我试图用一个类来实例化它,该类是这些接口和类的子类型,如下所示: public List<List<Value>> rows = new DbRowList<MyRow>(); 而MyRow是: public class MyRow extends ArrayList<Value> implements List<Value> { public Table table; } 为何不适用MyRo

我有一个属于
列表
类型的类的属性,我试图用一个类来实例化它,该类是这些接口和类的子类型,如下所示:

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

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

为何不适用
MyRow
扩展了
ArrayList
,它本身就是一个
列表

错误消息是不言自明的:编译器希望将
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);
List rows=new DbRowList();
MyRow=新建MyRow();
行。添加(行);

首先,您不需要所有这些“
实现列表”
”,因为
ArrayList
本身实现了
List

关于编译错误,这是对泛型的错误使用和理解。当您为
DbRowList
类的实例指定此类型变量时,您将能够添加特定类的特定实例,因此这段代码将编译并工作:

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

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

你为什么要这么做

重写方法以添加空的arrayList,而不是实际的参数值。元素未传递到任何位置

原因很简单:你试着把它传递给super.add,你想要哪个

E
但是你通过了

ArrayList<E>.
ArrayList。
您应该做的只是不重写该方法,而是正确定义类:

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

}

void testMethod(){
    List<List<Value>> rows = new DbRowList<>();
    rows.add(new ArrayList<>());
}
公共类DbRowList扩展了ArrayList{
}
void testMethod(){
列表行=新的DbRowList();
添加(新的ArrayList());
}
编辑:事实上,在键入时,我理解这并不完全是您想要的,所以请澄清:您需要保存行还是将元素保存到指定行?我描述的是保存整行,但您可能需要的是指向行的映射。然后可以将元素添加到指定行,而无需创建新行或加载/搜索所需的行

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<>());
}