Java 通用列表打印方法

Java 通用列表打印方法,java,list,generics,Java,List,Generics,我正在尝试编写一个通用的print方法,它适用于实现“Iterable”接口的所有类 public class List<T> { public static <T extends Iterable<T>> void print(T[] list){ for (Object element : list){ System.out.println(element); } } pub

我正在尝试编写一个通用的print方法,它适用于实现“Iterable”接口的所有类

public class List<T> {

    public static <T extends Iterable<T>> void print(T[] list){
        for (Object element : list){
            System.out.println(element);
        }
    }
    public static void main(String[] args){
        ArrayList<Integer> l = new ArrayList();
        l.add(1);
        l.add(5);
        l.add(3);
        l.add(2);
        print(l);
    }
}
公共类列表{
公共静态无效打印(T[]列表){
for(对象元素:列表){
系统输出打印项次(元素);
}
}
公共静态void main(字符串[]args){
ArrayList l=新的ArrayList();
l、 增加(1);
l、 增加(5);
l、 增加(3);
l、 增加(2);
印刷品(l);
}
}

但是我收到错误“类型列表中的方法print(T[])不适用于参数(ArrayList)”

您的参数是
T[]
。它是一个扩展了
Iterable
类型的数组。您只需要
T
。但是您还需要为
Iterable
中的类型参数提供一个类型变量。你需要

public static <T extends Iterable<E>, E> void print(T list) {
公共静态无效打印(T列表){

您之所以需要它,是因为您不需要当前实现中的
Iterable

如果
t
扩展
Iterable
,则只需执行以下操作:

public static <E, T extends Iterable<E>> void print(T list){
        for (Object element : list){
            System.out.println(element);
        }
}
公共静态无效打印(T列表){
for(对象元素:列表){
系统输出打印项次(元素);
}
}
编辑:您声明的是
T extensed Iterable
,例如,它可能是Iterable,这可能不是您想要实现的。然后只需添加列表中的另一种类型的元素

如果没有专门使用该类型,则还可以将泛型类型声明为:

<T extends Iterable<?>>

您的泛型定义不正确。您试图将边界设置为
,但泛型参数(
整数
)不是
t

public class Main {
    public static void main(String[] args) {
        ArrayList<Integer> l = new ArrayList<>();
        l.add(1);
        l.add(5);
        l.add(3);
        l.add(2);
        print(l);
    }

    public static <S, T extends Iterable<S>> void print(T list){
        for (Object element : list){
            System.out.println(element);
        }
    }
}
您可以通过引入一个单独的泛型参数使其工作:一个用于指示集合,另一个用于指示集合的值

旁注:您根本不需要
t[]
。您只需要
t

public class Main {
    public static void main(String[] args) {
        ArrayList<Integer> l = new ArrayList<>();
        l.add(1);
        l.add(5);
        l.add(3);
        l.add(2);
        print(l);
    }

    public static <S, T extends Iterable<S>> void print(T list){
        for (Object element : list){
            System.out.println(element);
        }
    }
}

由于
System.out.println
接受所有
对象
s,并且您没有在方法中真正使用泛型,我认为根本没有理由使用泛型。此代码将完成相同的任务:

public static void print(Iterable<?> list) {
    for (Object element : list) {
        System.out.println(element);
    }
}
此方法声明为接受一个参数,即:泛型类型T的数组,其中泛型类型T可在泛型类型T上执行

让我们再次阅读最后一部分:其中泛型类型T可在泛型类型T上Iterable

也就是说,泛型类型应该可以对自身进行iterable

您需要这样的类才能使用当前的
print
方法:

class MyClass implements Iterable<MyClass> {
    ...
}

但是,使用您当前的print方法,它只会为数组中的5个元素中的每一个调用
MyClass.toString
方法。

它也不会编译。是的,我只是更仔细地查看他的一般定义,这可能不正确。.我认为
print(Iterable)
也可以,除非我读得太快。@PaulBellora是的,你是对的。这也行(在这种情况下可能更好)。玩泛型很有趣。您可能不想给类命名
List
class List
中的
t
public static void print(t[]List)
中的
t
不同。
class MyClass implements Iterable<MyClass> {
    ...
}
MyClass[] objects = new MyClass[5];
print(objects);