fork download
  1. import java.util.*;
  2. import java.lang.*;
  3. import java.io.*;
  4.  
  5. abstract class A
  6. {
  7. final int value;
  8. protected A(int value) { this.value = value; }
  9. public int hashCode() { return value; }
  10. public boolean equals(Object o) {
  11. if (o == this) return true; if (o == null) return false;
  12. if (!(o instanceof A)) return false;
  13. return value == ((A)o).value; // ? extend A class???
  14. }
  15. }
  16.  
  17. class B extends A {
  18. final String name;
  19. public B(int value, String name) { super(value); this.name = name; }
  20. public int hashCode() { return name.hashCode() ^ super.hashCode(); }
  21. public boolean equals(Object o) {
  22. if (!super.equals(o)) return false;
  23. if (!(o instanceof B)) return false;
  24. return name.equals(((B)o).name); // ? extend B class???
  25. }
  26. }
  27.  
  28. class C extends A {
  29. public C(int value) { super(value); }
  30. // really need to override method equals
  31. }
  32.  
  33. abstract class X
  34. {
  35. final int value;
  36. protected X(int value) { this.value = value; }
  37. public int hashCode() { return value; }
  38. public boolean equals(Object o) {
  39. if (o == this) return true; if (o == null) return false;
  40. if (o.getClass() != getClass()) return false;
  41. return value == ((X)o).value;
  42. }
  43. }
  44.  
  45. class Y extends X {
  46. final String name;
  47. public Y(int value, String name) { super(value); this.name = name; }
  48. public int hashCode() { return name.hashCode() ^ super.hashCode(); }
  49. public boolean equals(Object o) {
  50. if (!super.equals(o)) return false;
  51. return name.equals(((Y)o).name); // depend calling getClass in super.equals
  52. }
  53. }
  54.  
  55. class Z extends X {
  56. public Z(int value) { super(value); }
  57. // depend calling getClass in super.equals
  58. }
  59.  
  60. class Ideone
  61. {
  62. static void println(Object o) { System.out.println(o); }
  63. public static void main (String[] args) throws java.lang.Exception
  64. {
  65. A a1 = new B(123, "hoge");
  66. A a2 = new B(123, "hoge");
  67. A a3 = new C(123);
  68. A a4 = new C(123);
  69.  
  70. println("a1 == a2 (want true): " + a1.equals(a2));
  71.  
  72. println("a1 == a3 (want false): " + a1.equals(a3));
  73.  
  74. println("a3 == a1 (want false): " + a3.equals(a1));
  75.  
  76. println("a3 == a4 (want true): " + a3.equals(a4));
  77.  
  78. println("---------");
  79.  
  80. X x1 = new Y(123, "hoge");
  81. X x2 = new Y(123, "hoge");
  82. X x3 = new Z(123);
  83. X x4 = new Z(123);
  84.  
  85. println("x1 == x2 (want true): " + x1.equals(x2));
  86.  
  87. println("x1 == x3 (want false): " + x1.equals(x3));
  88.  
  89. println("x3 == x1 (want false): " + x3.equals(x1));
  90.  
  91. println("x3 == x4 (want true): " + x3.equals(x4));
  92. }
  93. }
Success #stdin #stdout 0.03s 320576KB
stdin
Standard input is empty
stdout
a1 == a2 (want true): true
a1 == a3 (want false): false
a3 == a1 (want false): true
a3 == a4 (want true): true
---------
x1 == x2 (want true): true
x1 == x3 (want false): false
x3 == x1 (want false): false
x3 == x4 (want true): true