1

Playerインターフェイスを実装するこのクラスがありComparableます。それから私はArrayListsPlayerのを持っています。binarySearch()のリストでを使用してPlayerを見つけようとしてPlayerいますが、Java から " cannot find symbol: method binarySearch(java.util.ArrayList< Player>,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() を試してみると、うまくいきます。

4

2 に答える 2

13

一貫性のないジェネリックを使用しています。コンパイラの警告に注意してください。常に一般的な引数を指定します (または指定しないでください)。

それ以外の:

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

使用する

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

ジェネリックのルールは、まれな型の複雑さがなければ十分に難しいものです。したがって、通常、言語仕様は、それらを混同するとあきらめます。

于 2009-12-17T21:40:18.043 に答える
1

Comparableを実装している限り、andもオーバーライドすることcompareTo()で一貫性を保つことができます。に委任するだけなので、この場合は特に簡単です。さらに、次のインスタンスを含む必要がある場合に便利です。equals()equals()hashCode()StringMapPlayer

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();
    }
}
于 2009-12-18T03:32:40.050 に答える