Java 为什么Collections.binarySearch()不能与此进行比较?

Java 为什么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

我有一个Player类,它实现了可比较的接口。然后我有一个玩家列表。我试图在播放器列表上使用binarySearch来查找一个播放器,但是Java给了我一个找不到的符号:方法binarySearchjava.util.ArrayList,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时,它就起作用了。

用户不一致地使用泛型。注意编译器警告。始终提供泛型参数或从不提供它们

而不是:

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();
    }
}