メソッドをオーバーライドするクラスを拡張し、equals()
誰かがサブクラスに新しいアスペクトを追加したときにそれを「保存」しておくことはできないことを私は知っています。クラスPoint
とそのサブクラスを使用した一般的な例は、それを示しています。
public class Point {
Double d1;
Double d2;
public Point(double d1, double d2){
this.d1 = d1;
this.d2 = d2;
}
}
public class ColorPoint extends Point {
String color;
public ColorPoint(double d1, double d2, String s) {
super(d1, d2);
color = s;
}
}
equals()
メソッドとを作成する Eclipse がhashCode()
ある場合、 の場合は color 属性も考慮されますColorPoint
。したがって、このequals()
方法は対称的ではないことが証明されます。コード:
Point p1 = new Point(2,2);
ColorPoint cp1 = new ColorPoint(2, 2, "blue");
System.out.println(p1.equals(cp1));
System.out.println(cp1.equals(p1));
プリント:
真/偽
同様に、この方法が推移的でないことも証明できます。ただし、オブジェクトを a のキーとして渡すHasMap
と、渡す順序に関係なく、オブジェクトが異なるものとして認識されます。コード:
Point p1 = new Point(2,2);
Point p2 = new Point(3.1,3.1);
ColorPoint cp1 = new ColorPoint(2, 2, "blue");
ColorPoint cp2 = new ColorPoint(3.1,3.1, "red");
Map<Point, Integer> map = new HashMap<>();
map.put(cp2, 4); map.put(cp1, 3);
map.put(p1, 1); map.put(p2, 2);
System.out.println(map.size());
オブジェクトを別の順序で渡しても、常に4が出力されます。それは期待されていますか?Map
では、キーを比較するためにはどの方法を使用しますか?