Мы можем предоставить необязательный 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
, и это действительно так. Но очень запутанно, не очень понятно для меня. Добавлен снимок экрана с иерархией классов.
Вместо этого он наследуется от 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.
.
Я знаю, что это вопрос любопытства. Так что своевременный ответ не нужен. Но любая помощь будет оценена.