Properly removing an Integer from a List<Integer>

collections, java, overloading

Solution

Java always calls the method that best suits your argument. Auto boxing and implicit upcasting is only performed if there's no method which can be called without casting / auto boxing.

The List interface specifies two remove methods (please note the naming of the arguments):

- `remove(Object o)`

- `remove(int index)`

That means that `list.remove(1)` removes the object at position 1 and `remove(new Integer(1))` removes the first occurrence of the specified element from this list.

Problem

Here's a nice pitfall I just encountered. Consider a list of integers: ``` List<Integer> list = new ArrayList<Integer>(); list.add(5); list.add(6); list.add(7); list.add(1); ``` Any educated guess on what happens when you execute `list.remove(1)`? What about `list.remove(new Integer(1))`? This can cause some nasty bugs. What is the proper way to differentiate between `remove(int index)`, which removes an element from given index and `remove(Object o)`, which removes an element by reference, when dealing with lists of integers? The main point to consider here is the one @Nikita mentioned - exact parameter matching takes precedence over auto-boxing.

Original source