3

我有一个充满整数的列表:

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)

4

2 回答 2

5

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

每当你这样做list.add(score)时,score首先将其包装到一个Integer对象中,然后再添加到集合中。

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

可能的解决方案是

  • 将返回的值转换为 a Integer,从而允许拆箱
  • 使用equals方法而不是该==运算符,以便将分数装箱到 anInteger然后与结果进行比较max
于 2013-02-03T17:12:26.313 回答
2

尝试使用equals()比较:

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

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

于 2013-02-03T17:05:23.930 回答