为了好玩,我正在创建一个排序框架,以更好地理解各种排序算法。而且,我试图使其足够通用,以便它可以对实现扩展可比较接口的接口的任何内容进行排序。然而,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
在此先感谢您的帮助!
尝试写作implements Sorter<C>
。如果没有类型参数,您将使用原始类型,这会禁用继承方法的泛型的某些方面。具体来说,使用原始超类型,您只能继承已擦除的方法签名。在你的情况下,而不是继承该方法sort(C[] comparables)
你继承了一个方法sort(Comparable[] comparables)
,您只能使用相同的签名来覆盖它。
通过指定Sorter<C>
作为超类型,您继承了一个方法 `sort(C[] Compares),您可以使用相同的签名覆盖该方法。
诸如此类的陷阱就是为什么 Java 语言规范建议原始类型仅应用于与非泛型遗留代码的接口,并要求编译器在使用原始类型时发出警告。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)