JAVA GENERICS ERROR:具有相同的擦除,但不会覆盖另一个

时间:2015-06-04 18:24:56

标签: java generics comparable

为了好玩,我创建了一个排序框架,以便更好地理解各种排序算法。并且,我试图使它足够通用,以便它可以对实现扩展类似接口的接口的任何内容进行排序。但是,java编译器对我并不满意。

这是我的界面:

public interface Sorter<C extends Comparable<C>>
{
    void sort(C[] comparables);

    void sort(C[] comparables, Comparator<C> comparator);
}

而且,这是我实现该接口的抽象类:

public abstract class AbstractSort<C extends Comparable<C>> implements Sorter
{
    protected abstract void doSort(C[] comparables, Comparator<C> comparator);

    final public void sort(C[] comparables)
    {
        sort(comparables, new Comparator<C>()
        {
            public int compare(C left, C right)
            {
                return left.compareTo(right);
            }
        });
    }

    final public void sort(C[] comparables, Comparator<C> comparator)
    {
        doSort(comparables, comparator);
    }
}

而且,以下是我得到的错误:

java: name clash: sort(C[]) in AbstractSort and sort(java.lang.Comparable[]) in Sorter have the same erasure, yet neither overrides the other

Error:(25, 23) java: name clash: sort(C[],java.util.Comparator<C>) in AbstractSort and sort(java.lang.Comparable[],java.util.Comparator<java.lang.Comparable>) in Sorter have the same erasure, yet neither overrides the other

提前感谢您的帮助!

3 个答案:

答案 0 :(得分:3)

尝试撰写implements Sorter<C>。如果没有type参数,则使用原始类型,这会禁用继承方法的泛型的某些方面。具体来说,对于原始超类型,您只能继承已擦除的方法签名。在您的情况下,您继承方法sort(C[] comparables)而不是继承方法sort(Comparable[] comparables),而您只能使用相同的签名覆盖该方法。

通过将Sorter<C>指定为超类型,您可以继承一个方法`sort(C []可比较),您可以使用相同的签名覆盖它。

这就是为什么Java语言规范建议原始类型只应用于与非泛型遗留代码接口,并要求编译器在使用原始类型时发出警告的原因。

答案 1 :(得分:1)

我明白了。感谢您的帮助!

public interface Sorter<C extends Comparable<? super C>>
{
    void sort(C[] comparables);

    void sort(C[] comparables, Comparator<C> comparator);
}

public abstract class AbstractSort<C extends Comparable<? super C>> implements Sorter<C>
{
    protected abstract void concreteSort(C[] comparables, Comparator<C> comparator);

    final public void sort(C[] comparables)
    {
        sort(comparables, new Comparator<C>()
        {
            public int compare(Comparable left, Comparable right)
            {
                return left.compareTo(right);
            }
        });
    }

    final public void sort(C[] comparables, Comparator<C> comparator)
    {
        concreteSort(comparables, comparator);
    }
}

答案 2 :(得分:0)

问题是类和接口都有void sort(C[]),它们是冲突的。尝试将@Override表示法添加到类方法中。

我会说你过度设计了这个问题。我更喜欢界面,然后你可以做

Sorter<SortableClass> sorter = new QuickSorter<SortableClass>();

这很简单,而且可以达到目的。