Java:比较整洁的神秘面纱

时间:2013-02-03 17:03:15

标签: java int

我有一个填充了整个列表的列表:

List collection = new ArrayList();
collection.add(this.score1);
collection.add(this.score2);
collection.add(this.score3);

现在我想将最高分与每个分数进行比较,看看哪个分数最高。直觉上我试着这样做:

String highestScore;

if(Collections.max(collection) == this.score1) {
highestScore = "Score 1";
}

if(Collections.max(collection) == this.score2) {
highestScore += ", Score 2";

}

if(Collections.max(collection) == this.score3) {
highestScore += ", Score 3";

}

然而,

Collections.max(collection) == this.score1
Collections.max(collection) == this.score2
Collections.max(collection) == this.score3

所有人都给我错误:

  

不兼容的操作数类型Comparable和int

然而,这似乎有效:

int highestScoreValue =  Collections.max(collection);

现在怎么可能?

为什么Java允许将int设置为Collections.max(collection),但是不允许将int与Collections.max(collection)进行比较?

2 个答案:

答案 0 :(得分:5)

原始类型不能存储在Java集合中,它们会自动在相应的类中包装。

每当您执行list.add(score)时,score首先被包装到Integer对象中,然后添加到集合中。

现在,当您调用Collections.max时,会返回类型<T extends Object & Comparable<? super T>>的对象,并且您将它与具有==的基本类型进行比较,但此运算符只能将引用与对象或直接原始类型,在您的情况下,由于未指定List参数类型,编译器无法将Integer实例返回到int

可能的解决方案是

  • 将返回的值转换为Integer,从而允许取消装箱
  • 使用equals方法代替==运算符,以便将分数加到Integer,然后与max
  • 的结果进行比较

答案 1 :(得分:2)

尝试使用equals()进行比较:

Collections.max(collection).equals(this.score1)

请注意,max()方法会返回Comparable个对象,该对象无法与==int进行比较。另一种选择是首先将它投射到Integer。作为旁注,这不是找到最大值的最有效方法,您在原始类型和对象类型之间来回切换。更好地为整数实现自己的max方法。