Почему kotlin.coroutines.CoroutineContext.Element наследуется от kotlin.coroutines.CoroutineContext - PullRequest
0 голосов
/ 03 апреля 2019

Мы можем предоставить необязательный CoroutineContext при создании сопрограммы из таких функций компоновщика, как launch, например:

launch(Dispatchers.Unconfined) { // not confined -- will work with main thread
    println("Unconfined      : I'm working in thread ${Thread.currentThread().name}")
    delay(500)
    println("Unconfined      : After delay in thread ${Thread.currentThread().name}")
}

Одним из значений является Dispatchers.Unconfined. Я думал, что Dispatchers.Unconfined унаследует от CoroutineContext, и это действительно так. Но очень запутанно, не очень понятно для меня. Добавлен снимок экрана с иерархией классов.

enter image description here

Вместо этого он наследуется от CoroutineContext.Element. Который является вложенным интерфейсом внутри CoroutineContext. Этот вложенный интерфейс наследует внешний / родительский интерфейс, и все полезные реализации CoroutineContext реализуют этот вложенный интерфейс.

Я не уверен, почему эта механика или где еще такой шаблон используется или может быть использован. Единственное место, где вложенный интерфейс AFAIK используется для создания новых пространств имен, таких как Map.Entry. Официальная документация также очень мало говорит,

    /**
     * An element of the [CoroutineContext]. An element of the coroutine context is a singleton context by itself.
     */

Не совсем уверен, что означает An element of the coroutine context is a singleton context by itself..

Я знаю, что это вопрос любопытства. Так что своевременный ответ не нужен. Но любая помощь будет оценена.

1 Ответ

1 голос
/ 07 апреля 2019

Контекст сопрограммы - это набор элементов.Элемент контекста сопрограммы сам по себе является одноэлементным контекстом.Это означает, что при просмотре в виде набора (в качестве сопрограммного контекста) элемент представляет собой одноэлементный набор (он же синглтон).

...