代码之家  ›  专栏  ›  技术社区  ›  Heath Borders

具有显式返回类型的Kotlin lambda

  •  0
  • Heath Borders  · 技术社区  · 6 年前

    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() } lambda指定和显式返回类型。

    Kotlin中是否允许显式返回类型?这个 functionLiteral Grammar 让它看起来好像不可能,但我不是一个阅读语法的专家。

    1 回复  |  直到 5 年前
        1
  •  6
  •   Heath Borders    5 年前

    实际上,您不能在Kotlin lambda中显式声明返回类型:

    上面介绍的lambda表达式语法缺少的一点是指定函数返回类型的能力。

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

        2
  •  5
  •   Heath Borders    6 年前

    这成功了!其他人在另一个论坛上给了我答案,如果他们在这里回复,我会将他们的答案标记为正确。

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