为什么Collections.binarySearch()使用这个可比较的?

我有这个实现Comparable接口的Player类。 然后我有一个PlayerArrayList 。 我正在尝试在Player的列表中使用binarySearch()来查找一个Player ,但是Java给了我一个“ cannot find symbol: method binarySearch(java.util.ArrayList,Player) ”。

这个Player类:

 class Player implements Comparable { private String username; private String password; Statistics stats; //Constructor, creates a new Player with a supplied username Player(String name) { username = name; password = ""; stats = new Statistics(); } //Accessor method to return the username as a String String getName() { return username; } String getPassword() { return password; } void setPassword(String newPass) { password = newPass; } //Method to change the username void setName(String newName) { username = newName; } public int compareTo(Object o) { return username.compareTo(((Player)o).username); } } 

奇怪的是,当我在同一个列表上尝试Collections.sort()时,它可以工作。

使用不一致地使用generics。 注意编译器警告。 始终提供通用参数(或从不提供它们)。

代替:

 class Player implements Comparable { [...] public int compareTo(Object o) { 

使用

 class Player implements Comparable { [...] public int compareTo(Player o) { 

仿制药的规则很难,没有稀有类型的复杂性。 因此,如果你混淆它们,通常会放弃语言规范。

只要您实现Comparable ,您可以通过重写equals()hashCode()使compareTo()equals()保持一致。 在这种情况下,这非常简单,因为您可以简单地委托给String 。 此外,如果您需要包含Player实例的Map ,这很方便:

 class Player implements Comparable { private String username; private String password; // ... @Override public int compareTo(String name) { return username.compareTo(name); } @Override public boolean equals(Object obj) { return obj instanceof Player && username.equals(((Player)obj).username); } @Override public int hashCode() { return username.hashCode(); } }