Java 通用列表打印方法
我正在尝试编写一个通用的print方法,它适用于实现“Iterable”接口的所有类Java 通用列表打印方法,java,list,generics,Java,List,Generics,我正在尝试编写一个通用的print方法,它适用于实现“Iterable”接口的所有类 public class List<T> { public static <T extends Iterable<T>> void print(T[] list){ for (Object element : list){ System.out.println(element); } } pub
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);
}
}
公共类列表{
公共静态无效打印(T[]列表){
for(对象元素:列表){
系统输出打印项次(元素);
}
}
公共静态void main(字符串[]args){
ArrayList l=新的ArrayList();
l、 增加(1);
l、 增加(5);
l、 增加(3);
l、 增加(2);
印刷品(l);
}
}
但是我收到错误“类型列表中的方法print(T[])不适用于参数(ArrayList)”您的参数是
T[]
。它是一个扩展了Iterable
类型的数组。您只需要T
。但是您还需要为Iterable
中的类型参数提供一个类型变量。你需要
public static <T extends Iterable<E>, E> void print(T list) {
公共静态无效打印(T列表){
您之所以需要它,是因为您不需要当前实现中的
Iterable
。如果t
扩展Iterable
,则只需执行以下操作:
public static <E, T extends Iterable<E>> void print(T list){
for (Object element : list){
System.out.println(element);
}
}
公共静态无效打印(T列表){
for(对象元素:列表){
系统输出打印项次(元素);
}
}
编辑:您声明的是T extensed Iterable
,例如,它可能是Iterable,这可能不是您想要实现的。然后只需添加列表中的另一种类型的元素
如果没有专门使用该类型,则还可以将泛型类型声明为:
<T extends Iterable<?>>
您的泛型定义不正确。您试图将边界设置为
,但泛型参数(整数
)不是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);
}
}
}
您可以通过引入一个单独的泛型参数使其工作:一个用于指示集合,另一个用于指示集合的值
旁注:您根本不需要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);
}
}
}
由于System.out.println
接受所有对象
s,并且您没有在方法中真正使用泛型,我认为根本没有理由使用泛型。此代码将完成相同的任务:
public static void print(Iterable<?> list) {
for (Object element : list) {
System.out.println(element);
}
}
此方法声明为接受一个参数,即:泛型类型T的数组,其中泛型类型T可在泛型类型T上执行
让我们再次阅读最后一部分:其中泛型类型T可在泛型类型T上Iterable
也就是说,泛型类型应该可以对自身进行iterable
您需要这样的类才能使用当前的print
方法:
class MyClass implements Iterable<MyClass> {
...
}
但是,使用您当前的print方法,它只会为数组中的5个元素中的每一个调用MyClass.toString
方法。它也不会编译。是的,我只是更仔细地查看他的一般定义,这可能不正确。.我认为print(Iterable)
也可以,除非我读得太快。@PaulBellora是的,你是对的。这也行(在这种情况下可能更好)。玩泛型很有趣。您可能不想给类命名List
。class List
中的t
与public static void print(t[]List)
中的t
不同。
class MyClass implements Iterable<MyClass> {
...
}
MyClass[] objects = new MyClass[5];
print(objects);