猿问

Java 通用比较器

public class arr<T>

{

    class comp <T extends Comparable<T>> implements Comparator<T>

    {

        public int compare(T lObj,T rObj)

        {

              return lObj.compareTo(rObj);

        }

    }


    ArrayList<T> list;

    Comparator<T> comparator;

    public arr()

    {

        list = new ArrayList<T>();

        comparator = new comp();

    }

    public void add(T data)

    {

        list.add(data);         

    }

    public int getLength()

    {

        return list.size();

    }

    public T get(int index)

    {

        return list.get(index);

    }

    public void sort()

    {

        list.sort(comparator);

    }

}

您好,我正在尝试使排序功能正常工作,但遇到了问题。在arr构造函数中,如果我写


comparator = new comp<T>();

它给了我一个错误说


"type argument T#1 is not within bounds of type-variable T#2 comparator = 

new comp<T>();                            ^

where T#1,T#2 are type-variables:

T#1 extends Object declared in class arr

T#2 extends Comparable<T#2> declared in class arr.comp"

如果我取出类型并像这样写


comparator = new comp;

然后它确实有效,但给了我一个警告说


warning: [rawtypes] found raw type: arr.comp

comparator = new comp();

我可以看到原始类型的含义。我没有指定类型,但它以某种方式起作用,如果我尝试通过指定类型来修复警告,则会引发错误。你能帮我弄清楚吗?我知道......我是个菜鸟,我的代码一定会让你眼花缭乱。我正在使用通用比较器并尝试很多东西来熟悉。谢谢你。


米脂
浏览 178回答 1
1回答

森林海

您的代码是混淆了你,因为T通过定义comp是躲藏在T被定义arr。对于下面的解释,我将它们称为Tcomp和Tarr。Tcomp需要扩展Comparable,但Tarr不需要这样做,这意味着Tarr不能“映射”到Tcomp.要修复,请更改,Tarr因此还需要扩展Comparable:public class arr<T extends Comparable<T>>附带说明:您的comp类是一个内部类,但它不使用外部类中的任何内容,因此它应该是一个静态嵌套类:static class comp<T extends Comparable<T>> implements Comparator<T>或者,comp作为一个内部类,让它重用T来自外部类的:class arr<T extends Comparable<T>>{&nbsp; &nbsp; class comp implements Comparator<T>但是,由于 Java(8 或更高版本)带有Comparator用于比较Comparable对象的实现,您应该使用它:public class arr<T extends Comparable<T>>{&nbsp; &nbsp; ArrayList<T> list;&nbsp; &nbsp; Comparator<T> comparator;&nbsp; &nbsp; public arr()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; list = new ArrayList<T>();&nbsp; &nbsp; &nbsp; &nbsp; comparator = Comparator.naturalOrder();&nbsp; &nbsp; }&nbsp; &nbsp; // rest of code}
随时随地看视频慕课网APP

相关分类

Java
我要回答