【问题标题】:Java Generic ComparatorJava 通用比较器
【发布时间】:2018-09-13 04:14:11
【问题描述】:
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();

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

【问题讨论】:

  • 你在哪里跑new comp&lt;T&gt;T 类型不会存在于您的类之外,如果存在,它必须是其他 Comparable 类型。另外,new comp; 只是不编译,你需要括号

标签: java generics comparator


【解决方案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 或更高版本)附带了 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
}

【讨论】:

  • 非常感谢您的详尽解释!
  • @pizza 如果这回答了您的问题,您应该单击问题旁边的复选标记,以便其他人可以看到该问题已得到您满意的回答。
猜你喜欢
  • 1970-01-01
  • 2013-12-08
  • 1970-01-01
  • 2013-09-04
  • 1970-01-01
  • 2018-11-27
  • 2020-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多