Подтвердить что ты не робот

Как отличить ArrayList <> от списка <>

Может кто-нибудь объяснить мне, почему я не могу использовать List<> to ArrayList<> с первым подходом, и я делаю со вторым? Спасибо.

Первый подход:

ArrayList<Task> tmp = ((ArrayList<Task>)mTrackytAdapter.getAllTasks(token));

Второй подход:

ArrayList<Task> tmp = new ArrayList<Task>(mTrackytAdapter.getAllTasks(token));
4b9b3361

Ответ 1

Когда вы делаете второй, вы создаете нового arraylist, вы не пытаетесь притвориться, что другой список - это arraylist.

Я имею в виду, что, если исходный список реализован как связанный список или какой-то пользовательский список? Вы не узнаете. Второй подход предпочтительнее, если вам действительно нужно сделать arraylist из результата. Но вы можете просто оставить его в списке, что является одним из лучших преимуществ использования интерфейсов!

Ответ 2

Когда вы используете второй подход, вы инициализируете arraylist с его предопределенными значениями. Как обычно мы делаем ArrayList listofStrings = new ArrayList < > (); Скажем, у вас есть массив со значениями, теперь вы хотите преобразовать этот массив в arraylist.

вам нужно сначала получить список из массива с помощью массивов Array. Поскольку ArrayList является конкретным типом, реализующим интерфейс List. Не гарантируется, что метод asList вернет этот тип реализации.

List<String>  listofOptions = (List<String>) Arrays.asList(options);

тогда вы можете создать конструктор пользователя для создания массива с помощью предопределенных значений.

ArrayList<String> arrlistofOptions = new ArrayList<String>(list);

Итак, ваш второй подход работает над тем, что вы передали значения, которые будут атаковать arraylist элементами списка.

Больше

ArrayList, возвращаемый из массива Arrays.asList, не является фактическим arraylist, это просто оболочка, которая не допускает никаких изменений в списке. Если вы попытаетесь добавить или удалить файл Arrays.asList, он даст вам

UnsupportedOperationException

Ответ 3

Второй подход явно ошибочен, если вы хотите бросить. Он создает экземпляр нового ArrayList.

Однако первый подход должен работать просто отлично, тогда и только тогда, когда getAllTasks возвращает ArrayList.

Вам действительно нужно иметь ArrayList? не является ли интерфейс List достаточно? То, что вы делаете, может привести к исключению Runtime Exception, если тип неверен.

Если getAllTasks() возвращает ArrayList, вы должны изменить тип возвращаемого значения в определении класса, а затем вам не понадобится приведение, и если он вернет что-то еще, вы не сможете применить его к ArrayList.

Ответ 4

Просто попробуйте следующее:

ArrayList<SomeClass> arrayList;

 public SomeConstructor(List<SomeClass> listData) {
        arrayList.addAll(listData);
}

Ответ 5

Вы можете указать List < > в ArrayList < > если вы понимаете, что делаете. Компилятор Java не будет блокировать его.

Но:

  • Неправильная практика заключается в том, чтобы лить родительский тип в дочерний тип (или интерфейс к типу реализации) без проверки. Это лучше:

if (list instanceof ArrayList<Task>) { ArrayList<Task> arraylist = (ArrayList<Task>) list; }

  1. Возможно, вам не нужен тип реализации в качестве ссылки. Посмотрите предупреждение SonarQube https://sbforge.org/sonar/rules/show/squid:S1319. Вы можете избежать этого литья в большинстве случаев.
  2. Вы можете использовать метод Guava: ArrayList<Task> arraylist = Lists.newArrayList(list);

Ответ 6

Первый подход пытается отобразить список, но это будет работать, только если List<> был ArrayList<>. Это не относится к делу. Итак, вам нужен второй подход, который создает новый ArrayList<> с элементами List<>