Так, оскільки це не спосіб видалення діапазону із зовнішнього коду. Натомість зробіть це:
list.subList(start, end).clear();
Це насправді викликає removeRange
куліси. †
ОП запитує, чому removeRange
це не є частиною List
публічного API. Причина описана у пункті 40 Ефективної Java 2nd ed, і я цитую її тут:
Існує три методи скорочення занадто довгих списків параметрів. Один полягає в тому, щоб розбити метод на кілька методів, кожен з яких вимагає лише підмножини параметрів. Якщо зробити це необережно, це може призвести до занадто багатьох методів, але це також може допомогти зменшити кількість методів шляхом збільшення ортогональності. Наприклад, розглянемо java.util.List
інтерфейс. У ньому не передбачено методів пошуку першого чи останнього індексу елемента в підспілі, для обох яких знадобиться три параметри. Натомість він забезпечує subList
метод, який приймає два параметри та повертає перегляд підпису. Цей спосіб може поєднуватися з методами indexOf
або lastIndexOf
, кожен з яких має єдиний параметр, щоб отримати бажану функціональність. Більше того,subList
метод може бути поєднаний з будь-яким методом, який працює над List
екземпляром для виконання довільних обчислень у списках. Отриманий API має дуже високе співвідношення потужності до ваги.
Можна стверджувати, що removeRange
не має такої кількості параметрів і тому, ймовірно, не є кандидатом на це лікування, але, враховуючи, що існує спосіб викликати removeRange
через subList
, немає причин захаращувати List
інтерфейс надмірним методом.
†AbstractList.removeRange
документація говорить:
Цей метод викликається clear
операцією у цьому списку та його підсписками. Перевизначення цього методу, щоб скористатися внутрішніми можливостями реалізації списку, може істотно підвищити ефективність clear
операції в цьому списку та його підсписках.
Також див. Реалізацію AbstractList.clear
та SubList.removeRange
. OpenJDK .