推断类型不是可比较泛型类型的有效替代项

2022-09-04 03:00:24

考虑以下代码:

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);
    }
}


排序调用给出错误:

绑定不匹配:集合类型的泛型方法 sort(List< T >) 不适用于参数 (ArrayList< MyItem< T > >)。推断类型 MyItem< T >不是有界参数的有效替代物,< T 扩展了可比< ?超级T> >


为什么这是错的?

如果实现,那么为什么它不是替代品?MyItem<V>Comparable

很抱歉,如果有人问过这个问题,但我觉得这个问题有些具体。


答案 1

实际上,对此错误的更详细的解释会给出您自己: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>>

换句话说,必须在它自己实现接口。例如,类实现这样的接口:.TComparableString...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
    }
}

答案 2

为了使类型的对象彼此具有可比性,类必须完全实现 。XXComparable<X>

这不是你的代码正在做的事情,你有一个类,你正在实现而不是.这意味着 可以与 进行比较,但不能与 所需的 进行比较。Item<T>Comparable<T>Comparable<Item<T>>Item<T>TItem<T>

将您的课程更改为:Item<T>

public abstract class Item<T> implements Comparable<Item<T>>
{
    protected T item;

    @Override
    public int compareTo(Item<T> o)
    {
        return 0; // this doesn't matter for the time being
    }
}