В 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
вероятно , содержит все необходимые методы вам нужно.