繁体   English   中英

通用列表打印方法

[英]Generic list print method

我正在尝试编写一个通用的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);
    }
}

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

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

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

你需要这个,因为你不想要一个Iterable<ArrayList> ,它就是你当前实现中的那个。

您的通用定义不正确。 您正尝试将边界设置为<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

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

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

你做了什么

我还想补充一点,你很困惑T[] T[]表示“ T型数组 ”。 但是你试图传递一个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方法。

如果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<?>>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM