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?
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?
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.
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
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). –
Używam zwykłego ArrayList. Ale myślałem, że generics zostały wprowadzone w celu zmniejszenia tego rodzaju błędów. – cmn