Kotlin лямбда с явным возвращаемым типом

У меня есть следующие классы Котлина:

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() } указывала явный тип возвращаемого значения.

Разрешен ли явный тип возвращаемого значения в Котлине? функцияЛитеральная грамматика делает вид, что не может, но я не эксперт в чтении грамматики.

Добавляет in что-нибудь для вас? `` забавный дескриптор (single: Single <String>): Single <in Result> {return single .map {Result.Success ()} .onError {Result.Failure ()}} `` `

Eric Maxwell 16.11.2018 23:55

Я не могу переделать handle, поэтому нет.

Heath Borders 17.11.2018 00:01
Сортировка hashmap по значениям
Сортировка hashmap по значениям
На Leetcode я решал задачу с хэшмапой и подумал, что мне нужно отсортировать хэшмапу по значениям.
9
2
3 461
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это сработало! Кто-то еще дал мне ответ на другом форуме, и если он ответит здесь, я отмечу его ответ как правильный.

fun handle(single: Single<String>): Single<Result> {
  return single
    .map<Result> { Single.Success() }
    .onError<Result> { Single.Error() }
}

Отметил ответ gutenmorgenuhu как правильный, потому что они дали прямую ссылку на документы. stackoverflow.com/a/56311548/9636

Heath Borders 28.05.2019 06:33
Ответ принят как подходящий

Фактически вы не можете явно объявить возвращаемый тип в лямбде 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

Другие вопросы по теме