如何避免返回SAM接口的函数的对象expression式
我是一个kotlin新手所以也许这是微不足道的,但我没有find任何相关的帮助,在kotlinlang.org。
为了学习一点kotlin我喜欢实现PushStream
库。
我想要定义这样的基本types:
typealias Receiver = (T) -> bool typealias PushStream = (Receiver) -> Unit
AFAIKtypes别名不支持,所以上面只是伪代码。
所以我的第一个尝试是这样的:
interface Receiver : (T) -> Boolean { } interface PushStream : (Receiver) -> Unit { } fun singleton (v : T) : PushStream { return { r : Receiver -> r (v) } }
然后科特林说:
Error:(10, 12) Kotlin: Type mismatch: inferred type is (Receiver) -> Boolean but PushStream was expected
我似乎能够解决它:
fun singleton (v : T) : (Receiver) -> Unit { return { r : Receiver -> r (v) } }
但是这不是我想要的签名,特别是对于我可能需要指定完整函数types的更高级的操作符:
fun singleton (v : T) : ((T) -> Boolean) -> Unit { return { r : Receiver -> r (v) } }
我相信这会让API更难阅读。
我能做的是使用一个对象expression式:
fun singleton (v : T) : PushStream { return object : PushStream { operator override fun invoke (r : Receiver) : Unit { r (v) } } }
这工作,但我想使用Lambdaexpression式来保持代码更简洁。
任何提示欢迎。 此外,如果你知道任何有趣的博客/演示编程与高阶function在kotlin也将不胜感激。
由于没有types别名(尚),types签名不能*互相替代。 在你的情况下,你需要使用组合而不是inheritance来创建一个抽象层次:
open class Receiver(val op: (T) -> Boolean) open class PushStream (val op: (Receiver ) -> Unit) fun singleton (v: T): PushStream { return PushStream { r -> r.op(v) } }
我用类替换了接口,因为我没有看到代码的其余部分。 如果您需要接口,请使用工厂function:
interface Receiver { val op: (T) -> Boolean } fun receiver(op: (T) -> Boolean) = object : Receiver { override val op = op }
如果你在java中定义PushStream接口,你可以这样使用它:
fun singleton (v : T) : PushStream { return PushStream { r : Receiver -> r (v) } }
- Instrumentation测试将作为Android Studio 3(空测试套件)上的Local Unit测试运行,
- 我怎样才能创建一个“forEach”,返回一个对象是一个接收器的消费函数?
- 如何使用Kotlin与Proguard
- 在Kotlin中包含Javascript文件(不是模块)
- 如何将Java分配expression式转换为Kotlin
- Kotlin中的OnclickListener方法之间的区别
- android – 运行应用程序失败,错误“com.android.builder.dexing.DexArchiveMergerException:无法合并dex’
- 保持Java中的BaseActivity与Kotlin Activity兼容
- 在Android(Kotlin)中处理Singletons清理的建议方法是什么?