0

インターフェイスを実装する次のクラスがありComparableます。私はすでにそのcompareTo()メソッドを定義していますが、どういうわけか、コンパイラはまだそれを実装する必要があると言います.

public class Person implements Comparable { 
    private String fName;
    private String lName;
    private Integer age;
    public Person (String fName, String lName, int age)
    {
        this.fName = fName;
        this.lName = lName;
        this.age = age;
    }

    // Compare ages, if ages match then compare last names
    public int compareTo(Person o) {
        int thisCmp = age.compareTo(o.age);        
        return (thisCmp != 0 ? thisCmp : lName.compareTo(o.Name));
    }
}

エラーメッセージ:

The type Person must implement the inherited abstract method Comparable.compareTo(Object)
Syntax error on token "=", delete this token
    at me.myname.mypkg.Person.<init>(Person.java:6)

Objectメソッドでルートクラスにキャストする必要はないと確信していcompareTo() ます。では、何が間違っているのでしょうか?

4

4 に答える 4

6

compareToメソッドに一致するジェネリック型を追加する

public class Person implements Comparable<Person> { 
于 2013-10-16T13:17:56.747 に答える
6

Generic を使用する場合、クラスは次のようになります

class Person implements Comparable<Person> {

    private String fName;
    private String lName;
    private Integer age;

    public int compareTo(Person o) {
        int thisCmp = age.compareTo(o.age);        
        return (thisCmp != 0 ? thisCmp : lName.compareTo(o.fName));
     }      
}

ジェネリックを使用していない場合、クラスは次のようになります

class Person implements Comparable {

    private String fName;
    private String lName;
    private Integer age;    
    public int compareTo(Object  obj) {
        Person o= (Person) obj;
        int thisCmp = age.compareTo(o.age);        
        return (thisCmp != 0 ? thisCmp : lName.compareTo(o.fName));
     }  
}
于 2013-10-16T13:19:10.270 に答える
1
public int compareTo(Object o) {
        Person newObject =(Person)o;
        int thisCmp = age.compareTo(newObject.age);        
        return (thisCmp != 0 ? thisCmp : lName.compareTo(newObject.Name));
    }
于 2013-10-16T13:23:25.750 に答える
1

問題は、 を実装するComparableと、比較するタイプが であることが暗示されることですObject。はComparableと同じComparable<Object>です。2 つのオプションのうちの 1 つがあります。

オプション1(Reimeusが述べたように、また最良のオプション):宣言にパラメーターを追加します。

public class Person implements Comparable<Person> {

オプション 2: メソッド呼び出しを変更します (あまり洗練されていないソリューション):

// Compare ages, if ages match then compare last names
public int compareTo(Object o) {
    Person p = (Person)o;
    int thisCmp = age.compareTo(p.age);        
    return (thisCmp != 0 ? thisCmp : lName.compareTo(p.Name));
 }
于 2013-10-16T13:26:05.973 に答える