0

「boolean java.util.ArrayList.contains(Object o)」メソッドを使用して、(ArrayList 型の) リスト内の特定のオブジェクトを検索しています。

次のリンク http://docs.oracle.com/javase/7/docs/api/のメソッドの説明には、 次 のように記載されています。このリストに (o==null ? e==null : o.equals(e)) となる要素 e が少なくとも 1 つ含まれている場合。

だから私がしたいのは、Personというクラスで「equals()」メソッドをオーバーライド/再定義することです。次に、「MyStorage」という別のクラスで、リストに Person タイプのオブジェクトを入力します。この後、「contains()」メソッドを使用して、contains メソッドに引数として渡す Person オブジェクトと同じ優先度を持つ Person オブジェクトを見つけたいと思います。2 つの参照 x と y が同じオブジェクトを参照している場合に限り、contains メソッドが true を返すことは望ましくありません。代わりに、x と y の優先度が同じ場合に、contains メソッドが true を返すようにします。そのため、Person クラスの equals メソッドをオーバーライドしました。問題は、プリオ数ではなく参照に基づいて同等性をチェックしているように見えることです。

ここに私のテストコードが続きます...

import java.util.ArrayList;
import java.util.Iterator;


@SuppressWarnings("serial")
public class MyStorage<E> extends ArrayList<E> {

    public static void main(String [ ] args)
    {
        MyStorage<Person> list = new MyStorage<Person>();
        Person p1 = new Person(1);
        list.add(p1);
        Person p2 = new Person(2);
        list.add(p2);
        list.add(new Person(3));

                // This test code shows that the overridden equals method in class Person
                // is not used by contains method. Right?
        p1.setPrio(10);
        if(list.contains(p1))
            System.out.print("Found!");

    }

    public MyStorage(){
        super();
    }

//  @Override
//  public boolean contains(Object o){
//      Iterator<E> itr = super.iterator();
//      while(itr.hasNext()){
//          System.out.print("Works!");
//      }
//      return false;
//  }

}


// And the Person class....
public class Person {

    private int prio;

    public Person(int prio){
        this.prio = prio;
    }

    @Override
    public boolean equals(Object o){

        if(o instanceof Person){
            Person p = (Person) o;
            if(this.prio == p.prio)
                return true;
            else
                return false;
        }else{
            return false;
        }   
    }

    public void setPrio(int prio){
        this.prio = prio;
    }
}
4

1 に答える 1

0

を呼び出すp1.setPrio(10);と、ストレージ内の正確なインスタンスである が変更prioされるため、インスタンスをそれ自体と比較しているため、 がを返す必要p1があることは明らかです。equals()true

于 2013-06-09T16:40:08.683 に答える