Интерфейс списка Generics - PullRequest
4 голосов
/ 05 мая 2010

Интерфейс списка следующий:

public interface List<E>{
public boolean add(Object e);
public boolean remove(Object e);
public boolean contains(Object e);
...etc

Почему методы add, remove и содержат методы, написанные следующим образом?

public boolean add(E e)
public boolean remove(E e)
public boolean contains(E e)

Ответы [ 4 ]

3 голосов
/ 05 мая 2010

Метод сложения: add (E e) , так что с миром все в порядке.

Методы remove (Object o) и содержат (Object o) будут работать на основе o.equals(e). Это позволяет вам делать некоторые сложные вещи с объектами сравнения специального назначения, которые не обязательно относятся к типу объектов в коллекции.

List<Integer> list = Arrays.asList(20, 30, 40, 50, 100);
boolean moreThan60 = list.contains(new Object() {
    public boolean equals(Object rhs) {
        return ((Integer)rhs) > 60;
    }
});
System.out.println("moreThan60 = " + moreThan60);

Не то чтобы это всегда рекомендовалось или даже является лучшей практикой. Но это ловкий трюк.

1 голос
/ 05 мая 2010

Обратная совместимость.

Таким образом, вы все равно можете запускать код java <1.5 с java1.5 </p>

Так что, если у вас есть какой-то устаревший код, похожий на этот

List list = //your favorite implementation
list.add(new Car());
list.add(new MandelbrotFractal());

Вселенная не взорвется;

0 голосов
/ 05 мая 2010

Если есть ArrayList<String> и присвоить его List<?> list. Должен ли я быть в состоянии спросить list.contains("it")? Это очень полезно, если я могу.

0 голосов
/ 05 мая 2010

Это не правильно. Прототипы:

boolean add(E e)
boolean contains(Object o) 
boolean remove(Object o) 

Если вы правильно используете интерфейс, вы никогда не сможете добавить не-E в список. Вы все еще можете вызывать содержит и удалить с не-E. Технически List может создавать исключение ClassCastException, но это помечено как необязательное, и я не знаю ни одного класса, который это делает. Вероятно, он просто вернет false, а список останется без изменений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...