ter*_*ell 13 java generics collections
考虑一下代码:
public abstract class Item<T> implements Comparable<T>
{
protected T item;
public int compareTo(T o)
{
return 0; // this doesn't matter for the time being
}
}
public class MyItem<T> extends Item<String>
{
T object;
}
public class Foo<T>
{
protected ArrayList<T> list;
}
public class Bar<V> extends Foo<MyItem<V>>
{
public void sort()
{
Collections.sort(list);
}
}
Run Code Online (Sandbox Code Playgroud)
排序调用给出错误:
绑定不匹配:类型集合的泛型方法sort(List <T>)不适用于参数(ArrayList <MyItem <T >>).推断类型MyItem <T>不是有界参数的有效替代<T extends Comparable <?超级T >>
为什么这是错的?
如果MyItem<V>
实施Comparable
那么为什么它不是替代品呢?
对不起,如果有人询问,但我觉得这个问题有点具体.
And*_*niy 12
实际上,对这个错误的更详细的解释给你javac
自己:
java:找不到合适的方法
sort(java.util.ArrayList<MyItem<V>>
)方法
java.util.Collections.<T>sort(java.util.List<T>,java.util.Comparator<? super T>)
不适用(不能从参数实例化,因为实际和形式参数列表的长度不同)方法
java.util.Collections.<T>sort(java.util.List<T>)
是不适用(推断类型不符合宣告结合(一个或多个)推断:MyItem<V>
结合(一个或多个):java.lang.Comparable<? super MyItem<V>>
)
那么,主要问题是:
为什么方法Collections.<T>sort(java.util.List<T>)
)不适用?
答案是:
因为在Collections.<T>sort(java.util.List<T>)
方法声明中有参数的界限T
:<T extends Comparable<? super T>>
.
换句话说,T
必须Comparable
在它上面实现接口.例如,String
类实现了这样的接口:...implements ... Comparable<String>
.
在你的情况下,Item
类没有实现这样的接口:
Item<T> implements Comparable<T>
是不一样的Item<T> implements Comparable<Item<T>>
.
所以,为了解决这个问题,你应该把你的Item
班级改为这个:
public abstract class Item<T> implements Comparable<Item<T>>
{
protected T item;
public int compareTo(Item<T> o)
{
return 0; // this doesn't matter for the time being
}
}
Run Code Online (Sandbox Code Playgroud)