「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;
}
}