簡體   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