У меня есть следующие классы Котлина:
sealed class Result {
data class Success()
data class Failure()
}
class Single<R>(val value: R?, throwable: Throwable?) {
fun map(mapper: (R) -> T): Single<T> {
return Single(mapper(value!!), null)
}
fun onError(recover: (Throwable) -> T): Single<T> {
return Single(recover(throwable!!))
}
}
А у меня есть такая функция:
fun handle(single: Single<String>): Single<Result> {
return single
.map { Single.Success() }
.onError { Single.Error() }
}
Но onError не справляется с:
Type Mismatch.
Required: Single.Success
Found: Single.Error
Я понимаю, что могу обойти это с помощью:
fun handle(single: Single<String>): Single<Result> {
return single
.map { Single.Success() as Single<Result> }
.onError { Single.Error() as Single<Result> }
}
Но я предпочитаю, чтобы вывод типов работал как можно больше слева направо. То есть, я бы предпочел, чтобы лямбда { Single.Success() } указывала явный тип возвращаемого значения.
Разрешен ли явный тип возвращаемого значения в Котлине? функцияЛитеральная грамматика делает вид, что не может, но я не эксперт в чтении грамматики.
Я не могу переделать handle, поэтому нет.

Это сработало! Кто-то еще дал мне ответ на другом форуме, и если он ответит здесь, я отмечу его ответ как правильный.
fun handle(single: Single<String>): Single<Result> {
return single
.map<Result> { Single.Success() }
.onError<Result> { Single.Error() }
}
Отметил ответ gutenmorgenuhu как правильный, потому что они дали прямую ссылку на документы. stackoverflow.com/a/56311548/9636
Фактически вы не можете явно объявить возвращаемый тип в лямбде Kotlin:
One thing missing from the lambda expression syntax presented above is the ability to specify the return type of the function.
https://kotlinlang.org/docs/reference/lambdas.html#anonymous-functions
Добавляет
inчто-нибудь для вас? `` забавный дескриптор (single: Single <String>): Single <in Result> {return single .map {Result.Success ()} .onError {Result.Failure ()}} `` `