Java 泛型比较器

4
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();

我能理解"原始类型(raw types)"指的是什么。虽然我没有指定类型,但程序还是正常运行了,如果我尝试通过指定类型来修复警告的话,就会出现错误。您能帮我弄清楚这个问题吗?我知道我是个新手,我的代码可能让您感到头疼。我正在尝试使用泛型比较器,并尝试很多东西以增加熟练度。谢谢。


1
你在哪里运行 new comp<T>?这个 T 类型在这里的类之外是不存在的,如果存在的话,它必须是一个可比较的类型。另外,new comp; 是无法编译通过的,你需要加上括号。 - OneCricketeer
1个回答

6

你的代码让你感到困惑,因为 comp 定义的 T 隐藏了由 arr 定义的 T。在下面的解释中,我将称它们为 Tcomp 和 Tarr

需要将 Tarr 更改为扩展 Comparable,这样才能将 Tarr "映射" 到 Tcomp。注意,Tcomp是必须扩展 Comparable 的,但 Tarr 不是必须的。

要解决问题,请更改代码,使得 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或更高版本)内置了一个用于比较Comparable对象的Comparator实现,因此您应该使用它:

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
}

非常感谢您详尽的解释! - pizza
@pizza 如果这个回答解决了你的问题,你应该点击问题旁边的勾选标记,这样其他人就可以看到问题已经得到了满意的回答。 - Andreas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接