В Java рекомендуется использовать типы интерфейсов, а не конкретные классы в API.
Ваша проблема в том, что вы используете ArrayList(вероятно, во многих местах) там, где вам действительно стоит использовать List. В результате вы создали себе проблемы из-за ненужного ограничения, что список является расширением ArrayList.
Вот как должен выглядеть ваш код:
List input = new ArrayList(...);
public void doSomething(List input) {
List inputA = input.subList(0, input.size()/2);
...
}
this.doSomething(input);
Предлагаемое вами «решение» проблемы было следующим:
new ArrayList(input.subList(0, input.size()/2))
Это работает путем создания копии подсписка. Это не кусок в обычном понимании. Кроме того, если подсписок большой, создание копии будет дорогостоящим.
Если вы ограничены API-интерфейсами, которые вы не можете изменить , например, которые вы должны объявить inputAкак объект ArrayList, вы можете реализовать собственный подкласс, ArrayListв котором subListметод возвращает подкласс ArrayList. Тем не мение:
- Было бы много работы по разработке, внедрению и тестированию.
- Теперь вы добавили значительный новый класс в свою базу кода, возможно, с зависимостями от недокументированных аспектов (и, следовательно, «подлежащих изменению») аспектов
ArrayList класса.
- Вам нужно будет изменить соответствующие места в вашей кодовой базе, где вы создаете
ArrayListэкземпляры, чтобы вместо этого создать экземпляры вашего подкласса.
Решение «скопировать массив» более практично ... учитывая, что это не настоящие срезы.
ArrayList? Я думаю , что вы , возможно , не хватает немного понимания того, как интерфейсы работают , потому чтоListиArrayListне являются «несовместимыми» -ArrayListорудияList, и ,Listвероятно , содержит все необходимые методы вам нужно.