[英]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.