我正在尝试编写一个适用于实现“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)”
答案 0 :(得分:7)
您的参数为T[]
。这是一个扩展Iterable
的类型的数组。你只想要T
。但是您还需要Iterable
中类型参数的类型变量。你需要
public static <T extends Iterable<E>, E> void print(T list) {
您需要这样做,因为您不希望Iterable<ArrayList>
成为您当前实现中的内容。
答案 1 :(得分:4)
您的通用定义不正确。您尝试将边界设置为<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
答案 2 :(得分:2)
由于System.out.println
接受了所有Object
,并且您在方法中没有真正使用泛型,我认为根本没有理由使用泛型。这段代码将完成同样的事情:
public static void print(Iterable<?> list) {
for (Object element : list) {
System.out.println(element);
}
}
我还想补充一点,你很混淆T[]
。 T[]
表示&#34; 类型为T &#34;的数组。但是您尝试传递 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
方法。
答案 3 :(得分:0)
如果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<?>>