Java通用比较器

piz*_*zza 4 java generics comparator

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

您好,我正在尝试使排序功能工作但有问题.在arr构造函数中,如果我写的话

comparator = new comp<T>();
Run Code Online (Sandbox Code Playgroud)

它给我一个错误的说法

"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"
Run Code Online (Sandbox Code Playgroud)

如果我取出类型并写这样的话

comparator = new comp;
Run Code Online (Sandbox Code Playgroud)

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

warning: [rawtypes] found raw type: arr.comp
comparator = new comp();
Run Code Online (Sandbox Code Playgroud)

我可以看到原始类型意味着什么.我没有指定类型,但它以某种方式工作,如果我尝试通过指定类型来修复警告,则会抛出错误.你能帮帮我解决一下吗?我知道......我是一个菜鸟,我的代码一定是你眼中的痛苦.我正在玩通用比较器并尝试很多东西来熟悉.谢谢.

And*_*eas 6

您的代码是混淆了你,因为T通过定义comp躲藏T被定义arr.对于下面的解释,我会打电话给他们Tcomp,并Tarr.

Tcomp需要扩展Comparable,但Tarr不要求这样做,这意味着Tarr无法"映射"到Tcomp.

要修复,更改Tarr以便还需要扩展Comparable:

public class arr<T extends Comparable<T>>
Run Code Online (Sandbox Code Playgroud)

旁注:
您的comp类是一个内部类,但它不使用外部类中的任何内容,因此它应该是一个静态嵌套类:

static class comp<T extends Comparable<T>> implements Comparator<T>
Run Code Online (Sandbox Code Playgroud)

或者,保留comp为内部类,并让它重用T外部类:

class arr<T extends Comparable<T>>
{
    class comp implements Comparator<T>
Run Code Online (Sandbox Code Playgroud)

但是,由于Java(8或更高版本)带有Comparator用于比较Comparable对象的实现,您应该使用它:

public class arr<T extends Comparable<T>>
{
    ArrayList<T> list;
    Comparator<T> comparator;
    public arr()
    {
        list = new ArrayList<T>();
        comparator = Comparator.naturalOrder();
    }
    // rest of code
}
Run Code Online (Sandbox Code Playgroud)