Котлин лямбда с явным типом возврата - PullRequest
0 голосов
/ 17 ноября 2018

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

Разрешен ли явный тип возвращаемого значения в Kotlin? functionLiteral Grammar делает его похожим, что не может, но я не эксперт в чтении грамматик.

Ответы [ 2 ]

0 голосов
/ 26 мая 2019

Вы не можете явно объявить тип возвращаемого значения в лямбда-выражении Kotlin:

В представленном выше синтаксисе лямбда-выражения отсутствует одна возможность - указать тип возвращаемого значения функции.

https://kotlinlang.org/docs/reference/lambdas.html#anonymous-functions

0 голосов
/ 17 ноября 2018

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

fun handle(single: Single<String>): Single<Result> {
  return single
    .map<Result> { Single.Success() }
    .onError<Result> { Single.Error() }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...