Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么可以';t我使用ArrayList<;字符串>;作为泛型ArrayList的参数<;E>;方法_Java_Generics - Fatal编程技术网

Java 为什么可以';t我使用ArrayList<;字符串>;作为泛型ArrayList的参数<;E>;方法

Java 为什么可以';t我使用ArrayList<;字符串>;作为泛型ArrayList的参数<;E>;方法,java,generics,Java,Generics,我正在学习泛型,所以我制作了一个简单的java程序,这样我就可以了解它们到底是如何工作的。但是现在我被这个程序困住了,因为我不明白为什么它不起作用 public static void main(String[] args) { ArrayList<String> strings = new ArrayList<>(); strings.add("A"); strings.add("B"); pri

我正在学习泛型,所以我制作了一个简单的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());
        }
    }
publicstaticvoidmain(字符串[]args)
{
ArrayList字符串=新的ArrayList();
字符串。添加(“A”);
字符串。添加(“B”);
打印列表(字符串);
}
公共静态无效打印列表(ArrayList l)
{
对于(E obj:l)
{
System.out.println(obj.toString());
}
}
几乎肯定不是你想要的。这说明您的元素类型是一个自身的列表

相反,只写
几乎肯定不是你想要的。这说明您的元素类型是一个自身的列表


相反,只写

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

您的方法应该如下所示:

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

    for (E obj : list) {

        System.out.println(obj);
    }
}
公共静态无效打印列表(列表){
对于(E obj:列表){
系统输出打印项次(obj);
}
}
注:

  • 使用有意义的参数名称,如
    list
    not
    l
    ,以便代码维护人员理解您的代码

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

  • 如果希望代码更加健壮,请将参数设置为
    List
    ,以便可以接受所有
    List
    对象,例如
    LinkedList
    和所有其他实现


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

您的方法应该如下所示:

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

    for (E obj : list) {

        System.out.println(obj);
    }
}
公共静态无效打印列表(列表){
对于(E obj:列表){
系统输出打印项次(obj);
}
}
注:

  • 使用有意义的参数名称,如
    list
    not
    l
    ,以便代码维护人员理解您的代码

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

  • 如果希望代码更加健壮,请将参数设置为
    List
    ,以便可以接受所有
    List
    对象,例如
    LinkedList
    和所有其他实现


为什么需要
E
来扩展
列表
?因为您已指定
E
来扩展
列表
。对于
String
,这是不正确的。您的形式参数实际上是
ArrayList。您在方法泛型中指定的是,传递给方法的参数将是
ArrayList
。基本上是一张名单。然后,您向它传递一个
字符串列表
。只需取出
部件,您就可以开始了。为什么需要
E
来扩展
列表
?因为您已指定
E
来扩展
列表
。对于
String
,这是不正确的。您的形式参数实际上是
ArrayList。您在方法泛型中指定的是,传递给方法的参数将是
ArrayList
。基本上是一张名单。然后,您向它传递一个
字符串列表
。只要拿出
部件,您就可以开始了。