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