Я работаю над реализацией List
. Из-за этого мне придется переопределить методы
Collection.containsAll(Collection<?> c);
Collection.removeAll(Collection<?> c);
Collection.retainAll(Collection<?> c);
Но, как объясняет Sun , они принимают коллекции с любым видом контента (обратите внимание на <?>
). Таким образом, коллекция не проверяется компилятором, и я должен это проверить. Но как это сделать? instanceof
для каждого элемента не будет работать из-за стирания типа. Следующим решением было бы наложить каждый элемент на улов ClassCastException
. Смотрите здесь:
public boolean containsAll( Collection<?> c ) {
boolean foundAll = true;
for ( Object element : c ) {
try {
foundAll &= this.contains( (T) element );
} catch ( ClassCastException e ) {
foundAll = false;
}
}
return foundAll;
}
Два других метода выглядят одинаково. Это работает. Но это дает мне предупреждение компилятора "предупреждение: [не проверено] не проверено приведение"! Если я не подавлю это с помощью «@SuppressWarnings("unchecked")
», он не будет компилироваться нормально.
Я не хочу полагаться на "@SuppressWarnings("unchecked")
", если мне действительно не нужно. Есть ли способ избежать этого? Как бы вы реализовали такие методы, как containsAll(Collection<?> c)
?
редактировать
Хорошо, извините, ребята, я не был достаточно ясен. Я не расширяю AbstractList
и не хочу. Мой список реализован с помощью сбалансированного двоичного дерева. У меня есть собственная реализация insert()
, remove()
, contains()
(которая фактически выполняет поиск листа) и т. Д., И все они принимают аргумент (универсального) типа T
. Основная цель - создать отсортированный список, который можно изменять, пока он повторяется.
Итак ... как мне избежать предупреждения в containsAll(Collection <?>)
? Я должен бросить!
Спасибо!
craesh