2012-09-12 9 views
7

Pytanie mówi wszystko ..lista jest surowy

z listy w kodzie:

Add metoda: public boolean add(E e) { ... }

Natomiast usunięcie metoda: public boolean remove(Object o) { .. }

Czy istnieje konkretny powód tego?

Odpowiedz

7

Od the javadoc:

Jeśli ta lista nie zawiera elementu, to niezmienione

więc dodanie do kolumny tutaj byłoby po prostu bezużyteczne, natomiast ograniczeniem add zapewnia przy kompilacji czas lista zawiera to, co jest napisane na pudełku.

Należy zauważyć, że istnieją pewne swoboda dla realizacji, sposób może wyrzucić

ClassCastException jeśli typ określonego elementu jest niezgodne z tej listy (opcja)

Implementacja ArrayList nie rzuca tego wyjątku:

439 public boolean remove(Object o) { 
440   if (o == null) { 
441    for (int index = 0; index < size; index++) 
442     if (elementData[index] == null) { 
443      fastRemove(index); 
444      return true; 
445     } 
446   } else { 
447    for (int index = 0; index < size; index++) 
448     if (o.equals(elementData[index])) { 
449      fastRemove(index); 
450      return true; 
451     } 
452   } 
453   return false; 
454  } 

Oznacza to, że nie masz aby sprawdzić klasę surowych obiektów przed wykonaniem operacji usuwania.

+0

Nie spowoduje to jednak błędu czasu kompilacji, jeśli wywołasz go z niewłaściwym typem. To, co robiłem, to usuwanie elementu, jeśli zawiera go pewna tablica. Zamiast robić 'list.remove (array [i])', zrobiłem 'list.remove (array)', które znalazłem podczas runtime. – cmn

+0

W zależności od implementacji listy może być całkowicie legalne próba usunięcia obiektu niewłaściwego typu. Jest to "zgodne z projektem" i czasami jest przydatne (jeśli masz surowe obiekty do "usunięcia", oznacza to, że nie musisz sprawdzać ich klasy przed wykonaniem operacji usuwania). –

+0

Używam zwykłego ArrayList. Ale myślałem, że generics zostały wprowadzone w celu zmniejszenia tego rodzaju błędów. – cmn

Powiązane problemy