我有一个填充了整个列表的列表:
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)
进行比较?
答案 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
方法。