#java #list #kotlin #arraylist
#java #Список #kotlin #arraylist
Вопрос:
В Kotlin метод mutableListOf возвращает экземпляр java.util.ArrayList, который реализует интерфейс MutableList от Kotlin.
Теперь метод listOf возвращает экземпляр java.util .Массивы $ArrayList, которые реализуют интерфейс списка Kotlin.
Насколько я понимаю, List и MutableList просто предназначены для двух разных «представлений» ArrayList, неизменяемых и изменяемых. Почему они сопоставляются с, казалось бы, разными классами ArrayList, когда они, как сопоставляющие интерфейсы, определяют поведение и использование ArrayList в Kotlin?
В чем разница между java.util .ArrayList и java.util .Массивы $ArrayList ? Я не смог найти ничего о последнем в документах Java. Этот вопрос возникает из-за того, что этот код выводит в консоль:
val list = listOf(1, 2, 3)
val mutableList = mutableListOf(1, 2, 3)
println( list.javaClass ) // class java.util.Arrays$ArrayList
println( mutableList.javaClass ) // class java.util.ArrayList
Комментарии:
1. Программирование Kotlin: создание элегантных, выразительных и производительных приложений JVM и Android от Venkat Subramaniam. Глава 5, использование коллекций. «Kotlin предоставляет два разных представления для списков, наборов и карт: представление только для чтения или неизменяемое представление и представление для чтения-записи или изменяемое представление».
2. Ага, я запутался в вашей формулировке, извините. Похоже, у вас недопонимание интерфейсов.
3. Я считаю, что да.
Ответ №1:
Почему они сопоставляются с, казалось бы, разными классами ArrayList, когда они, как сопоставляющие интерфейсы?
Интерфейсы не «сопоставляются» с классами. Интерфейсы определяют набор требований. Если класс реализует интерфейс, это означает, что он соответствует всем требованиям, указанным в этом интерфейсе.
listOf
возвращает объект, который способен выполнять все действия, перечисленные в List
интерфейсе. Это означает, что функция, которая должна быть объявлена для «return a List
» Аналогично, mutableListOf
возвращает объект, который способен выполнять все действия, перечисленные в MutableList
интерфейсе.
Не имеет значения, какой конкретный тип объекта возвращают методы, если они способны выполнять действия, указанные в интерфейсе. Какой конкретный тип они возвращают, т.Е. listOf(...)::class
и mutableListOf()::class
Являются деталями реализации. Поскольку они являются деталями реализации, вы не должны воспринимать это как «абсолютную истину» и говорить что-то вроде « listOf
возвращает an java.util.Arrays$ArrayList
«. На самом деле, это не так. На момент написания listOf<Integer>()::class
является class kotlin.collections.EmptyList
.
В любом случае, java.util.Arrays$ArrayList
это неизменяемый список. Это частный внутренний класс в java.util.Arrays
. Обычно вы видите этот класс в Java, когда вы это делаете Arrays.asList
, который служит аналогичной цели listOf
, но опять же, это деталь реализации. С другой стороны, java.util.ArrayList
является изменяемым.
Хотя listOf
он мог быть разработан для возврата an ArrayList
(это совершенно нормально), и его изменяемый характер может быть скрыт за неизменяемым List
интерфейсом (который ArrayList
также реализует), можно предположить, что возврат an Arrays$ArrayList
предпочтительнее, потому что 1) он не создает копию массива, в который вы передали listOf
. 2) Он реализует List
.
Комментарии:
1. Спасибо, ваш ответ на самом деле прояснил для меня гораздо больше, чем просто мой вопрос.
Ответ №2:
Ну, java.util.Arrays$ArrayList
это вложенный класс внутри Arrays
класса. Основное различие между java.util.Arrays$ArrayList
и java.util.ArrayList
заключается в том, что первый имеет фиксированную длину, в то время как длина последнего может расти. Оба списка поддерживаются массивами.
java.util.Arrays$ArrayList
также будет возвращаемым типом Arrays.asList
, который используется для создания неизменяемого списка из массива.
Это причина, MutableList
по которой наследуется от java.util.ArrayList
и List
, с другой стороны, наследуется от java.util.Arrays$ArrayList
, поскольку он неизменяем.