在Comparator的比较函数中没有比较整数对象

时间:2018-02-18 20:31:57

标签: java

class MyComparator<Integer> implements Comparator<Integer>
{

    @Override
    public int compare(Integer o1, Integer o2) {
        if(o1>o2) // line no 3
         return 1;
         else if(o1==o2)
             return 0;
         else
             return -1;
    }
}

在第3行,既没有取消装箱,也没有能够调用intValue()。请帮助理解这一点。

在第3行,编译错误即将来临。

3 个答案:

答案 0 :(得分:5)

您应该删除<Integer>中的MyComparator<Integer>。这里发生的是您将Integer声明为类型变量。它不是java.lang.Integer,它只是编译器一无所知的某种类型变量。

答案 1 :(得分:-1)

一旦解决了词典中提到的问题,此代码中的第二个问题。

if(o1==o2)

这是通过引用进行比较,因为两个操作数都是引用类型。

如果至少有一个操作数是数字类型(即==以外的原语),则

boolean只是数字相等运算符。

明确取消收件箱:

if(o1.intValue()==o2.intValue())

或者检查o1 < o2,它没有参考值的对应物,因此将取消包装数字操作数。

答案 2 :(得分:-1)

正如词汇提到的那样,你不要为方法注释

class MyComparator <Integer> implements Comparator<Integer>

如果您不想在该范围内重新定义Integer。相反,使用:

class MyComparator implements Comparator<Integer>
{
      @Override
      public int compare (Integer o1, Integer o2) {
        return o2 - o1;
      }
}

引用众所周知的整数。

import java.util.*;

class MyComparator implements Comparator<Integer>
{
      @Override
      public int compare (Integer o1, Integer o2) {
        return o2 - o1;
      }
}

public class CmpInt
{
    /** */
    public static void main (String args[])
    {
        int a[] = {1, 3, 7, 9, 4, 2, 5};
        List <Integer> li = new ArrayList<> ();
        for (int i: a)
            li.add (i);
        Comparator <Integer> ci = new MyComparator ();
        Collections.sort (li, ci);
        for (Integer ii: li)
            System.out.printf ("%d ", ii);
      System.out.println ();
    }
}