Являются ли списки Kotlin ... "инстанцируемыми" интерфейсами? - PullRequest
0 голосов
/ 19 июня 2019

Итак, у меня есть класс, который моделирует строку битов.Это было бы здорово сделать с простым старым списком целых, но на практике я хотел бы получить коллекцию Kotlin.

Я хочу получить базовую неизменяемую коллекцию.В Java List это интерфейс.В Kotlin это также, кажется, имеет место.Документация говорит, что это так, поэтому логика говорит, что это невозможно создать.Однако ... если это так, то что возвращает listOf()?

Выполнение простого listOf() в Kotlin REPL дает результат, который указывает, что List является инстанцируемым.

listOf(1,2,3)
res: kotlin.collections.List<kotlin.Int> = [1, 2, 3]

Мои вопросы:

  1. Является ли List инстанцируемым?
  2. Если нет, то что возвращает listOf и почему Котлин говорит, что это List?
  3. И какую «базовую» неизменяемую коллекцию (которая уже реализована, поэтому мне не нужно реализовывать ее с нуля), если я буду расширять, зная, что хочу получить обычную неизменяемую коллекцию с такими функциями, как filter /Карта / индекс / etdc.а несколькими дополнительными методами?

Ответы [ 2 ]

1 голос
/ 19 июня 2019

Чтобы расширить ответ r2rek:

  1. Является ли 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>. Вызов этого выглядит как вызов конструктора,но это не так!)

1 голос
/ 19 июня 2019

listOf возвращает реализации интерфейса List - EmptyList, Collections.singletonList (element) или elements.asList ()

Я бы сказал, что вы должны использовать listOf именно для точки № 3:)

...