import java.util.ArrayList;

// Error común: equals(WrongFraction) es un overload, no un override. Quien
// llama con un Object (como ArrayList.contains) usa el equals de Object.
public class EqualsOverloadDemo {
    static final class WrongFraction {
        private final long num;
        private final long den;

        WrongFraction(long num, long den) {
            this.num = num;
            this.den = den;
        }

        // Sin @Override: el compilador no avisa que esto no es un override.
        public boolean equals(WrongFraction f) {
            return num == f.num && den == f.den;
        }

        @Override
        public int hashCode() {
            return 31 * Long.hashCode(num) + Long.hashCode(den);
        }
    }

    public static void main(String[] args) {
        WrongFraction a = new WrongFraction(1, 2);
        WrongFraction b = new WrongFraction(1, 2);
        Object o = b;
        IO.println("a.equals(b): " + a.equals(b));   // elige equals(WrongFraction)
        IO.println("a.equals(o): " + a.equals(o));   // elige equals(Object)

        ArrayList<WrongFraction> list = new ArrayList<>();
        list.add(a);
        IO.println("list.contains(b): " + list.contains(b));
    }
}
