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

您好,我正在尝试使sort函数起作用,但是有问题。
在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();

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

最佳答案

您的代码使您感到困惑,因为T定义的comp隐藏了T定义的arr。对于以下说明,我将它们称为TcompTarr

扩展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>>
{
    class comp implements Comparator<T>

但是,由于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
}

07-24 09:27