Почему в Kotlin mutableListOf возвращает экземпляр java.util.ArrayList, в то время как listOf возвращает экземпляр java.util .Массивы $ArrayList ?

#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 , поскольку он неизменяем.