有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我可以理解原始类型的含义。我没有指定类型,但不知何故它是有效的,如果我试图通过指定类型来修复警告,那么它会抛出一个错误。你能帮我弄清楚吗?我知道。。。我是一个傻瓜我的代码一定是你眼中的痛。我正在玩通用比较器,并尝试着熟悉很多东西。多谢各位


共 (1) 个答案

  1. # 1 楼答案

    您的代码让您感到困惑,因为由comp定义的T隐藏了由arr定义的T。对于下面的解释,我将它们称为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或更高版本)附带了用于比较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
    }