将列表复制到Java中的列表列表的通用方法

时间:2018-11-25 15:26:28

标签: java generics wildcard

我正在尝试创建尽可能通用的方法,以将列表复制到列表列表中。我已经尝试过这个了:

public static <E> void addToMatrix(List<E> list, List<List<? extends E>> matrix) {
    matrix.add(list);
}

这是我用来测试该方法的主要内容:

public static void main(String[] args) {
    List< List<? extends Number> > matrix = new ArrayList<>();
    List<Integer> list = new ArrayList<>(); 

    addToMatrix(list, matrix);
}

为什么它不起作用? 如何在不更改方法逻辑的情况下以适当的方式执行此操作?

2 个答案:

答案 0 :(得分:1)

我认为您可以使它最通用(在第一个List参数中将“ E”替换为“?extends E”):

public static <E> void addToMatrix(List<? extends E> list, List<List<? extends E>> matrix)
{
    matrix.add(list);
}

这将编译并允许您的方法接受E的任何子类型(包括Integer和Number的另一个子类型)。

答案 1 :(得分:0)

您还可以将方法定义更改为:

public static <E> void addToMatrix(List<? extends E> list, List<List<? extends E>> matrix) {
    matrix.add(list); 
}

因为add的{​​{1}} API期望使用参数List<E>,在您的情况下该参数为类型E e的{​​{1}}。