通用列表打印方法

时间:2014-01-06 19:14:57

标签: java list generics

我正在尝试编写一个适用于实现“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);
    }
}

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

4 个答案:

答案 0 :(得分:7)

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

public static <T extends Iterable<E>, E> void print(T list) {

您需要这样做,因为您不希望Iterable<ArrayList>成为您当前实现中的内容。

答案 1 :(得分:4)

您的通用定义不正确。您尝试将边界设置为<T extends Iterable<T>>,但通用参数(Integer)不是T

您可以通过引入一个单独的通用参数来实现它:一个用于指示集合,另一个用于指示集合的值。

旁注:您根本不需要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);
        }
    }
}

输出

1
5
3
2

答案 2 :(得分:2)

由于System.out.println接受了所有Object,并且您在方法中没有真正使用泛型,我认为根本没有理由使用泛型。这段代码将完成同样的事情:

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

你做了什么

我还想补充一点,你很混淆T[]T[]表示&#34; 类型为T &#34;的数组。但是您尝试传递 ArrayList ,这与数组不同(类ArrayList使用常规数组在内部,但那是无关紧要的。)

让我们来看看你原来的方法声明:

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

声明此方法接受以下参数:泛型类型T的数组,其中泛型类型T在泛型类型T上是Iterable。

让我们再次阅读最后一部分:其中泛型类型T在泛型类型T上是可迭代的。

也就是说,泛型类型应该可以迭代。

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

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

然后使用这样的打印方法:

MyClass[] objects = new MyClass[5];
print(objects);

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

答案 3 :(得分:0)

如果T延伸Iterable,那么就这样做:

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

编辑:你声明的是T extends Iterable<T>,例如可以是Iterable,这可能不是你想要实现的。然后只需添加另一种类型的列表元素。

如果您没有专门使用该类型,那么您也可以将泛型类型声明为:

<T extends Iterable<?>>