Java 为什么Collections.binarySearch()不能与此进行比较?
我有一个Player类,它实现了可比较的接口。然后我有一个玩家列表。我试图在播放器列表上使用binarySearch来查找一个播放器,但是Java给了我一个找不到的符号:方法binarySearchjava.util.ArrayListJava 为什么Collections.binarySearch()不能与此进行比较?,java,generics,collections,binary-search,comparable,Java,Generics,Collections,Binary Search,Comparable,我有一个Player类,它实现了可比较的接口。然后我有一个玩家列表。我试图在播放器列表上使用binarySearch来查找一个播放器,但是Java给了我一个找不到的符号:方法binarySearchjava.util.ArrayList,Player 这是玩家的职业: class Player implements Comparable { private String username; private String password; Statistics stat
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时,它就起作用了。用户不一致地使用泛型。注意编译器警告。始终提供泛型参数或从不提供它们 而不是:
class Player implements Comparable {
[...]
public int compareTo(Object o) {
使用
如果没有罕见类型的复杂性,泛型规则就足够困难了。因此,如果你把它们混在一起,语言规范通常会放弃。使用的是不一致的泛型。注意编译器警告。始终提供泛型参数或从不提供它们 而不是:
class Player implements Comparable {
[...]
public int compareTo(Object o) {
使用
如果没有罕见类型的复杂性,泛型规则就足够困难了。因此,如果您将它们混在一起,通常语言规范会放弃。只要您正在实现,您就可以通过重写equals和hashCode使compareTo与equals一致。在这种情况下,这尤其容易,因为您可以简单地委托给String。此外,如果您需要一张包含玩家实例的地图,这也很方便:
只要您正在实现,就可以通过重写equals和hashCode使compareTo与equals一致。在这种情况下,这尤其容易,因为您可以简单地委托给String。此外,如果您需要一张包含玩家实例的地图,这也很方便:
你能告诉我们调用集合的代码吗?binarySearch?你能告诉我们调用集合的代码吗?binarySearch?哇,这解决了问题。谢谢我一定错过了文档中的那部分。哇,这解决了问题。谢谢我一定错过了文件中的那部分。
class Player implements Comparable<String> {
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();
}
}