Чтобы расширить ответ r2rek:
- Является ли
List
инстанцируемым?
Нет.Как и в Java, это интерфейс. *
(Он отличается от Java в основном компилятором Kotlin, в котором скрыты все методы мутации. Вместо этого они доступны в новом подчиненном интерфейсе MutableList
. Это делает егоПроще сказать компилятору, что изменчиво, а что нет. Однако JVM видит только List
.
REPL сообщает вам тип ссылки, а не тип конкретного класса, на который она указываетк.Вот еще один пример:
>>> val n: Number = 1
>>> n
res1: kotlin.Number = 1
>>> n::class
res2: kotlin.reflect.KClass<out kotlin.Number> = class kotlin.Int
Если нет, то что возвращает listOf
и почему Котлин говорит, что это List
?
Возвращает некоторую реализацию List
.Это не говорит вам, какой из них, и ваш код не должен знать или заботиться.(Если это так, вам следует создать что-то более конкретное!)
Метод listOf()
, конечно, будет знать конкретный тип, который он создает, но сигнатура метода просто возвращает List
.Это сделано для того, чтобы он мог возвращать разные реализации для разных входных данных.
(Например, он может возвращать один и тот же пустой экземпляр списка для каждого вызова без элементов; и он может выбирать разные реализации для маленьких и больших списков.А в будущих версиях это можно настроить для повышения производительности. Пока ваш код полагается только на то, что он возвращает что-то, что реализует List
, он все равно будет работать нормально.)
И какую «базовую» неизменяемую коллекцию […] мне следует расширить, зная, что я хочу получить обычную неизменяемую коллекцию с такими функциями, как filter / map / index / etdc.и с несколькими дополнительными методами?
Вы, вероятно, справляетесь с любым типом List
listOf()
, который вам дает.
Вы можете написать свою собственную реализациюесли вам нужно какое-то очень необычное поведение, но в 99% случаев нет никакой реальной выгоды (и много возможностей для ошибок и потери будущих улучшений).
Помните, что в дополнение к основным методам,Интерфейс List
содержит, Kotlin также позволяет использовать множество методов расширения в стандартной библиотеке (any()
, associate()
, chunked()
, count()
…).Таким образом, вы получаете множество функций «бесплатно»!
(* Чтобы запутать проблему, у Kotlin есть функция fun <T> List(size: Int, init: (Int) -> T): List<T>
. Вызов этого выглядит как вызов конструктора,но это не так!)