Почему в списке Java есть List.toArray (), а в массивах нет Array.toList ()? - PullRequest
0 голосов
/ 24 декабря 2018

Массивы не имеют функции "toList", поэтому нам нужны вспомогательные функции "Arrays.asList" для преобразования.

Это довольно странно: List имеет свою собственную функцию для преобразования в массив, но массивам нужны некоторые вспомогательные функции для преобразования в список.Почему бы не позволить массивам иметь функцию "toList", и в чем причина такого дизайна Java?

Большое спасибо.

Ответы [ 5 ]

0 голосов
/ 24 декабря 2018

С современной точки зрения, нет веской причины, по которой массивам не хватает упомянутого вами метода, а также тонны других методов, которые значительно облегчили бы их использование.Единственная объективная причина заключается в том, что «это имело смысл для разработчиков Java двадцать два года назад».Это был другой ландшафт в 1996 году, эпоха, когда C и C ++ были доминирующими языками программирования общего назначения.

Вы можете сравнить это, например, с Kotlin, языком, который компилируется в тот же байт-код, что и Java.Его массивы являются полнофункциональными объектами.

0 голосов
/ 24 декабря 2018

Как уже отмечали другие: массив в Java является довольно "низкоуровневой" конструкцией.Хотя это Object, на самом деле это не часть объектно-ориентированного мира.Это верно для массивов ссылок, таких как String[], но даже в большей степени для примитивных массивов, таких как int[] или float[].Эти массивы - это скорее «сырые, непрерывные блоки памяти», которые имеют прямое представление внутри виртуальной машины Java.

С точки зрения языкового дизайна, массивы в Java могут даже рассматриваться как дань C иC ++.Есть языков, которые являются чисто объектно-ориентированными и в которых не существует простых массивов или примитивных типов, но Java не является одним из них.

Более конкретно, сосредоточив внимание на вашем вопросе:

Важным моментом здесь является то, что Arrays#asList делает , а не делает какие-либо преобразования.Он создает только List, то есть представление в массиве.В отличие от этого, метод Collection#toArray действительно создает новый массив.Я написал несколько слов о последствиях этой разницы в этом ответе о списках, которые создаются с помощью Arrays#asList.

Кроме того, метод Arrays#asList работает только для массивов, гдеэлементы являются ссылочными типами (например, String[]).Он не работает для примитивных массивов, таких как long[] *.Но, к счастью, есть несколько способов справиться с этим, и я упомянул несколько из них в этом ответе о том, как преобразовать примитивные массивы в List объекты .


* На самом деле Arrays#asList работает для примитивных массивов, таких как long[], но не создает List<Long>, а List<long[]>.Это часто источник путаницы ...

0 голосов
/ 24 декабря 2018

Массивы - это примитивы, у которых нет методов (за исключением String), поэтому вы должны использовать методы из другого класса.Список является ссылочным типом, поэтому он может иметь методы.

0 голосов
/ 24 декабря 2018

Еще один момент, на который следует обратить внимание, это то, что toArray() объявлено в ИНТЕРФЕЙСЕ (в частности, в интерфейсе java.util.List ).

Следовательно, выдолжен вызвать toArray() для некоторого экземпляра объекта, который реализует List.

Это может помочь объяснить хотя бы одну часть вашего вопроса: почему это не статично ...

0 голосов
/ 24 декабря 2018

Поскольку экземпляры List являются фактическим объектом, а массивы (для целей и задач MOST) являются примитивами и не предоставляют методов.Хотя технически массивы - это объект, который может иметь поле length и вызов метода, например clone(), но их классы создаются после компиляции JVM.

...