Ответ 1
Подпись функции flatMap
следующая, когда используется в Kotlin:
public final fun <R: Any!, T: Any!>
Observable<T>.flatMap(
func: ((T) -> Observable<out R!>!)!
) : Observable<R!>!
Из документов:
Любая ссылка в Java может быть
null
, что делает требования Котлинса строгой нулевой безопасности непрактично для объектов, поступающих с Java. Типы деклараций Java обрабатываются специально в Котлине и называются типы платформ. Нулевые проверки ослаблены для таких типов, так что безопасность гарантии для них такие же, как в Java
и
T!
означает "T
илиT?
"
Это означает, что компилятор Kotlin может рассматривать возвращаемый тип функции flatMap
как Observable<TestUser>
или Observable<TestUser?>
, или даже Observable<TestUser>?
. Релаксационная часть говорит так: "Мы не хотим беспокоить вас этими неизвестными типами, вы, вероятно, знаете лучше".
Так как тип возврата явно указан в getTestUser()
, он использует первый. Поскольку тип observable
явно не задан, он передает его Observable<TestUser?>
на основе функции getUser()
.
Как заметил @voddan, есть открытая проблема, обсуждающая эту проблему: https://youtrack.jetbrains.com/issue/KT-11108