推断类型不是Comparable泛型类型的有效替代

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)