Почему Collections.binarySearch () не работает с этим сопоставимым? - PullRequest
1 голос
/ 18 декабря 2009

У меня есть класс Player, который реализует интерфейс Comparable. Тогда у меня есть ArrayList из Player с. Я пытаюсь использовать binarySearch() в списке Player s, чтобы найти один 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 () в этом же списке, это работает.

Ответы [ 2 ]

13 голосов
/ 18 декабря 2009

Использование используется непоследовательным образом. Обратите внимание на предупреждения компилятора. Всегда предоставляйте общие аргументы (или никогда не предоставляйте их).

Вместо:

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

Используйте

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

Правила дженериков достаточно сложны без усложнения редких типов. Поэтому, как правило, языковая спецификация сдается, если вы их перепутаете.

1 голос
/ 18 декабря 2009

Пока вы реализуете Comparable , вы можете сделать compareTo() совместимым с equals(), также переопределив equals() и hashCode(). Это особенно легко в этом случае, так как вы можете просто делегировать String. Более того, удобно, если вам когда-нибудь понадобится Map содержащий экземпляры Player:

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