L'interfaccia List
contiene due metodi remove()
- remove(Object)
e remove(int)
.
L'implementazione di remove(Object)
in Java 6 è la seguente:
public boolean remove(Object o) {
if (o == null) {
for (int index = 0; index < size; index++)
if (elementData[index] == null) {
fastRemove(index);
return true;
}
} else {
for (int index = 0; index < size; index++)
if (o.equals(elementData[index])) {
fastRemove(index);
return true;
}
}
return false;
}
L'implementazione di remove(int)
in Java 6 è:
public E remove(int index) {
RangeCheck(index);
modCount++;
E oldValue = (E) elementData[index];
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null; // Let gc do its work
return oldValue;
}
Nel tuo primo esempio, si sta effettivamente chiamando il remove(int)
metodo, che rimuove l'oggetto nell'indice specificato. In questo caso, hai specificato l'indice 2, che in realtà è il valore "3".
Nel vostro secondo esempio, si sta chiamando il metodo remove(Object)
, dal momento che non v'è un metodo remove(long)
e un long
non sarà convertito in un int
. Basato sull'implementazione del metodo remove(Object)
, cerca l'uguaglianza degli oggetti. Poiché il tuo elenco contiene oggetti di tipo Integer
e stai fornendo uno Long
, nulla lo abbinerà.
Il seguente metodo è probabilmente un esempio migliore di quello che sta accadendo:
public static void main(String[] args) {
ArrayList<Integer> list;
System.out.println("Removing intNum");
int intNum = 2;
list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
System.out.println("List = " + list);
list.remove(intNum);
System.out.println("List = " + list);
System.out.println("Removing longNum");
long longNum = 2;
list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
System.out.println("List = " + list);
list.remove(longNum);
System.out.println("List = " + list);
}
L'uscita di questo codice è:
Removing intNum
List = [1, 2, 3]
List = [1, 2]
Removing longNum
List = [1, 2, 3]
List = [1, 2, 3]
Ora che si vede che elemento list.remove (2) è la rimozione dall'indice 2 e non intero 2, si dovrebbe fare un punto per cast esplicito su "int" o "Integer" o si rischia solo di confondersi. – Neil
Questa potrebbe essere una bella domanda per un'intervista tecnica. – beetstra