Kotlin语法混乱:fun Foo.bar()=(…)

我很困惑下面的代码行应该做什么:

fun MyContext.req() = request as LaunchRequest 

LaunchRequest是一个Java类,而MyContext是一个Kotlin数据类。 我试过查找使用这种语法的Kotlin代码的例子,但是还没有find任何东西。

MyContext没有req()函数,那么这是为MyContext定义一个新的函数,它返回一个types为LaunchRequest “request”variables?

  1. 它是在接收方MyContext上定义的名为req的扩展函数 。 这种技术用于在不使用inheritance的情况下向现有的类添加新的function。 这个具体的例子req可以在MyContext任何对象上MyContext

    如果你有一个MyContext的引用,可以这样使用:

     val ctx: MyContext = ... val req: LaunchRequest = ctx.req() 
  2. as关键字用于将可变request LaunchRequestLaunchRequest

  3. 如果函数声明中的=也会导致混淆:它被称为带有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()