blob: ca94d849da18532497759a64e2551d3f1c49c8d0 [file] [view]
There are two overloads of the method `List.remove`:
[`remove(int index)`][index] removes an element at the specified index, and
[`remove(Object element)`][element] removes the specified element. When used
with a list of integers (`List<Integer>`), the overload resolution can be
confusing and may lead to bugs if the wrong overload is selected or if the
code's intent is not clear to readers.
[index]: https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/List.html#remove(int)
[element]: https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/List.html#remove(java.lang.Object)
Consider the following code:
```java
List<Integer> list = new ArrayList<>();
// ...
list.remove(1);
```
In this case, `list.remove(1)` calls `remove(int index)`, removing the element
at index 1. If the intention was to remove the element with value 1, this code
is incorrect.
To make the intent explicit and avoid ambiguity, add a comment before the
argument:
If you meant to remove by value (element):
```java
list.remove(/* element */ ii);
```
If you meant to remove by index:
```java
list.remove(/* index */ 1);
```
If you need to change the type to select the correct overload, you can use
explicit boxing/unboxing:
```java
list.remove(Integer.valueOf(i)); // remove by element
list.remove(ii.intValue()); // remove by index
```
[JDK-8384074](https://bugs.openjdk.org/browse/JDK-8384074) discusses adding a
new `List::removeAtIndex` method to the JDK to avoid this potential overload
confusion.