Kotlin语法混乱:fun Foo.bar()=(…)
我很困惑下面的代码行应该做什么:
fun MyContext.req() = request as LaunchRequest
LaunchRequest
是一个Java类,而MyContext
是一个Kotlin数据类。 我试过查找使用这种语法的Kotlin代码的例子,但是还没有find任何东西。
MyContext
没有req()
函数,那么这是为MyContext
定义一个新的函数,它返回一个types为LaunchRequest
“request”variables?
-
它是在接收方
MyContext
上定义的名为req
的扩展函数 。 这种技术用于在不使用inheritance的情况下向现有的类添加新的function。 这个具体的例子req
可以在MyContext
任何对象上MyContext
。如果你有一个
MyContext
的引用,可以这样使用:val ctx: MyContext = ... val req: LaunchRequest = ctx.req()
-
as
关键字用于将可变request
LaunchRequest
为LaunchRequest
。 -
如果函数声明中的
=
也会导致混淆:它被称为带有expression式体的函数,当函数包含代码中给出的单个expression式时,可以用它替换块体 (用大括号括起来)。
这些是Kotlin的扩展function,有助于提高一个类的function,而不需要写大量的样板代码。function也可以写成
fun MyContext.req(): LaunchRequest(){ return (request as LaunchRequest) }
扩展function的另一个例子(animation视图)是:
fun View.animatePulsing() { val animation = AnimatorSet() .... .... animation.duration = 150 animation.start() }
我们可以使用这个:
txtView.animatePulsing()
- JUnit,@ControllerAdvice和缺少Kotlin中检查的异常
- 在Kotlin项目中使用的传统Java库中保持零安全
- RxJava BehaviorSubject不发射最后一项?
- 开发者控制台缺少崩溃原因
- Kotlin中的Firebase SDK – onChildChanged不会触发列表中的第一个子项
- 在gradle应用程序中找不到ant-javafx
- Buildertypes的生成器? 如何把这个翻译成kotlin?
- Kotlin:unit testing期间@JvmStatic方法NoClassDefFoundError / ClassNotFoundException
- 我在java代码中实现了一个在kotlin中定义的接口。 有’空’types不允许在这里