gpt4 book ai didi

kotlin - 如何避免返回 SAM 接口(interface)的函数的对象表达式

转载 作者:行者123 更新时间:2023-12-02 12:39:57 24 4
gpt4 key购买 nike

我是一个 kotlin 新手,所以这可能是微不足道的,但我在 kotlinlang.org 上找不到任何相关帮助。

为了学习一些关于 kotlin 的知识,我喜欢实现 PushStream图书馆。

我想定义这样的基本类型:

typealias Receiver<T>   = (T) -> bool
typealias PushStream<T> = (Receiver<T>) -> Unit

目前还不支持 AFAIK 类型别名,所以上面只是伪代码。

所以我的第一次尝试是这样的:
interface Receiver<T> : (T) -> Boolean {
}

interface PushStream<T> : (Receiver<T>) -> Unit {
}

fun <T> singleton (v : T) : PushStream<T> {
return { r : Receiver<T> -> r (v) }
}

kotlin 然后说:
Error:(10, 12) Kotlin: Type mismatch: inferred type is (Receiver<T>) -> Boolean but PushStream<T> was expected

我似乎能够通过以下方式解决它:
fun <T> singleton (v : T) : (Receiver<T>) -> Unit {
return { r : Receiver<T> -> r (v) }
}

但这不是我想要的签名,特别是对于我可能需要指定完整函数类型的更高级的运算符:
fun <T> singleton (v : T) : ((T) -> Boolean) -> Unit {
return { r : Receiver<T> -> r (v) }
}

我相信这会使 API 更难阅读。

我能做的是使用对象表达式:
fun <T> singleton (v : T) : PushStream<T> {
return object : PushStream<T> {
operator override fun invoke (r : Receiver<T>) : Unit {
r (v)
}
}
}

这可行,但我想使用 Lambda 表达式来保持代码更简洁。

欢迎任何提示。此外,如果您知道任何有趣的关于在 kotlin 中使用高阶函数进行编程的博客/演示文稿,那也将不胜感激。

最佳答案

由于(还)没有类型别名,类型签名不能*相互替代。在您的情况下,您需要使用组合而不是继承来创建一个抽象级别:

open class Receiver<T>(val op: (T) -> Boolean)

open class PushStream<T>(val op: (Receiver<T>) -> Unit)

fun <T> singleton (v: T): PushStream<T> {
return PushStream<T> { r -> r.op(v) }
}

我用类替换了接口(interface),因为我看不到其余的代码。如果您需要接口(interface),请使用工厂函数:
interface Receiver<T> {
val op: (T) -> Boolean
}

fun <T> receiver(op: (T) -> Boolean) = object : Receiver<T> {
override val op = op
}

关于kotlin - 如何避免返回 SAM 接口(interface)的函数的对象表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37976406/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com