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行,编译错误即将来临。
答案 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 ();
}
}