为什么我不能将ArrayList <string>用作通用ArrayList <e>方法的参数?

时间:2018-06-18 18:30:18

标签: java generics

我正在学习泛型,所以我做了一个简单的java程序,这样我就可以了解它们是如何工作的。但是现在我被这个程序困住了,因为我看不出为什么它不起作用。

public static void main(String[] args)
    {
        ArrayList<String> strings = new ArrayList<>();
        strings.add("A");
        strings.add("B");

        printList(strings);
    }

    public static <E extends List<E>> void printList(ArrayList<E> l)
    {
        for (E obj : l)
        {
            System.out.println(obj.toString());
        }
    }

2 个答案:

答案 0 :(得分:6)

<E extends List<E>>几乎肯定不是你想要的。这就是你的元素类型是它自己的列表。

相反,只需编写<E>

答案 1 :(得分:4)

您的通用参数E不应扩展列表。如果E extends List<E>那么你应该期待List< List<> >

您的方法应该类似于:

public static <E> void printList(List<E> list) {

    for (E obj : list) {

        System.out.println(obj);
    }
}

注意:

  • 使用有意义的参数名称,例如list而非l,以便代码维护者了解您的代码

  • System.out.println(object.toString())可简化为System.out.println(object),因为toString()会自动调用

  • 如果您希望代码更加健壮,请将参数设为List<E>,以便您可以接受List<E>所有LinkedList<E>个对象以及所有其他实现。