2

「equals()」が Java でどのように機能するかを理解しようとしています。特に「toString()」とは対照的です。これは、私をコースから外している例です。


public class Car
{
    String make, model;

    public Car( String model, String make )
    {
        this.make  = model;
        this.model = make;
    }   

    public String toString()
    {
        String str = "This is a car. ";
        str += "Make: " + make + " | Model: " + model;
        return str;
    }

    public boolean equals( Car c )
    {
        return ( make.equals( c.make ) && model.equals( c.model ) );
    }
}

public class Node 
{
    protected Object obj;
    protected Node next;

    public Node( Object o )
    {
        this.obj = o;
        this.next = null;
    }

    public String toString()
    {
        return obj.toString();
    }

    public boolean equals( Node n )
    {
        return ( this.obj.equals( n.obj ) );
    }
}

Car c1 = new Car("toyota", "corolla");
Car c2 = new Car("toyota", "corolla");

Node nC1 = new Node( c1 );
Node nC2 = new Node( c2 );

nC1.print();
nC2.print();


if( nC1.equals( nC2 ) )
    System.out.println("They are equal!");
else
    System.out.println("They are NOT equal!");

ここで nC1.print() と nC2.print() は期待どおりに動作します。版画:

This is a car. Make: toyota | Model: corolla
This is a car. Make: toyota | Model: corolla

ただし、 nC1.equals( nC2 ) では、次のように出力されます。

"They are NOT equal!"

要するに、問題は「toString()」をオーバーライドできますが、「equals()」はオーバーライドできないということです。私は何が欠けていますか?この動作には簡単な説明があると思います。

4

4 に答える 4

7

メソッドのシグネチャを次のように保持する必要があると思います。

public boolean equals(Object obj)

補足として、オーバーライドするメソッド内に注釈を入れ@Overrideて、正しいメソッドをオーバーライドしていることを確認してください。そうしないと、コンパイラが文句を言います。

于 2012-07-26T01:18:29.067 に答える
4

メソッドのシグネチャは

@Override
public boolean equals(Object o) { ... }

しようとしたようにパラメーターの型を変更することはできません。equals in の便利なパターンは次のとおりclass Foo です。

@Override
public boolean equals(Object o) {
    if (o instanceof Foo) {
        Foo foo = (Foo)o;
        return <expression testing equality of foo and this> ;
    }
    return false;
}

あなたの例では、

@Override
public boolean equals(Object o)  
{  
    if (o instanceof Car) {
        Car car = (Car)o;
        return this.make.equals(car.make) && this.model.equals(car.model);
    }
    return false;  
}  
于 2012-07-26T01:24:04.020 に答える
1

メソッドの署名はpublic boolean equals( Car c ). equals(Object)したがって、Java はメソッドをオーバーライドしません。代わりに、オーバーロードします。

equals()メソッドNodeは を呼び出しCar.equals(Object)ているため、別の実装を使用しています。

代わりにこれを行う必要があります。

public boolean equals( Object o )
{
    Car c = (Car)o;
    return ( make.equals( c.make ) && model.equals( c.model ) );
}
于 2012-07-26T01:21:13.143 に答える
0

とった。有益なヒントとコメントをありがとうございました。このコードは、クラス Car の equals(..) コードを次のように置き換えることで、必要に応じて機能します。

public boolean equals( Object o )
{
    if( o instanceof Car )
    {
        if( make.equals( ((Car)o).make ) && model.equals( ((Car)o).model ) )
            return true;
        else
            return false;
    }
    else
        return false;
}
于 2012-07-26T02:01:40.310 に答える