【问题标题】:Kotlin - Can you specify return type explicitly on a lambda?Kotlin - 您可以在 lambda 上明确指定返回类型吗?
【发布时间】:2020-02-07 16:45:07
【问题描述】:

我有一个界面

private interface WithTokenExecutor<T> {
    fun execute(token: Token): Single<T>
}

和一个异步获取访问令牌的函数 withToken 然后返回执行的WithTokenExecutor 参数和新令牌。

private fun <T> withToken(executor: WithTokenExecutor<T>): Single<T> { 
    return essentialApiTokenProvider.getTokenObservable(true) // returns an observable with the token
        .flatMap { token -> executor.execute(token)) }
}

然后我调用函数:

fun getAppData(apps: List<String>): Single<AppsList> {
    return withToken(object : WithTokenExecutor<AppsList> {
        override fun execute(token: Token): Single<AppsList> {
            return api.getDetails(token) // retuns a Single<AppsList>
        }
    })
}

这行得通,所以我的问题是,即使 withToken 和 WithTokenExecutor 函数的返回类型是通用的,是否可以将返回语句从匿名类更改为 lambda?

我试过这样做:

return withToken({ token -> api.getDetails(token) })

但是编译器说:

Type inference failed: fun &lt;T&gt; withToken(executor: StoreManager.WithTokenExecutor&lt;T&gt;):Single&lt;T&gt; cannot be applied to ((???) -&gt; Single&lt;AppsList&gt;)

有没有办法明确定义这些函数的返回类型,同时仍然保留 lambda?

【问题讨论】:

  • 您的 withToken 函数不接受 lambdas 作为参数。您必须显式创建一个这样做的重载。允许您输入 lambda 而不是接口对象的功能接口仍处于 Kotlin 1.4 的规划阶段:blog.jetbrains.com/kotlin/2019/12/…

标签: kotlin lambda rx-java anonymous-function


【解决方案1】:

如果您可以选择将WithTokenExecutor 的声明修改为:

typealias WithTokenExecutor<T> = (t : Token) -> Single<T>

...您将能够像这样实现您的getAppData

fun getAppData(apps: List<String>): Single<AppsList> = withToken { api.getDetails(it) }

如果无法更改声明,那么在 @Pawel 指出 cmets 中提到的 Kotlin 1.4 之前,您似乎很不走运。

【讨论】:

    猜你喜欢
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    • 2014-05-31
    • 1970-01-01
    相关资源
    最近更新 更多