Leon
Leon

Reputation: 35

How to implement equals method which works on generics

I have the following problem. I have the following classes

public class Main {
    public static void main(String[] args) {

        // Expected:    true
        // Results in:  true
        List<String> strLst = new ArrayList<>();
        strLst.add(new String("A"));
        System.out.println(strLst.contains(new String("A")));

        // Expected:    true
        // Results in:  true
        List<Number> numLst = new ArrayList<>();
        numLst.add(new Number(1));
        System.out.println(numLst.contains(new Number(1)));

        // Expected:    true
        // Results in:  false
        Container<String> integers = new Container<>();
        integers.add(new String("A"));
        System.out.println(integers.contains(new String("A")));

        // Expected:    true
        // Results in:  false
        Container<Number> numbers = new Container<>();
        numbers.add(new Number(1));
        System.out.println(numbers.contains(new Number(1)));
    }    
}


class Container<T> {
    ArrayList<Node<T>> internal = new ArrayList<>();

    public void add(T elem) {
        internal.add(new Node<>(elem));
    }


    public boolean contains(T label) {
        for (Node<T> e : internal) {
            if (e.getLabel().equals(e)) {
                return true;
            }
        }
        return false;
    }
}

class Node<T> {
    T label;
    public Node(T label) {
        this.label = label;
    }

    public T getLabel() {
        return label; 
    }
}

class Number {
    private int val;
    
    public Number(int val) {
        this.val = val;
    }

    public boolean equals(Object o) {
        if (o instanceof Number) {
            return this.val == ((Number) o).val;
        }
        return false;
    }
}

I am not sure what went wrong here. I would expect similar behavior with my Container as with ArrayList. But it does not, because in my opinion ArrayList (see https://github.com/openjdk-mirror/jdk7u-jdk/blob/master/src/share/classes/java/util/ArrayList.java#L251) implements contains in a similar way.

What does ArrayList do different than I do? And if it is not possible to implement such behavior the way I hope to, how would I do this alternatively?

Upvotes: 0

Views: 52

Answers (1)

Cheng Thao
Cheng Thao

Reputation: 1493

The line

 if (e.getLabel().equals(e)) {

in contains should be

 if (e.getLabel().equals(label)) {

Solution:

    public boolean contains(T label) {
        for (Node<T> e : internal) {
            if (e.getLabel().equals(label)) {
                return true;
            }
        }
        return false;
    }

Upvotes: 2

Related Questions