相关疑难解决方法(0)

Kotlin中的静态扩展方法

如何在Kotlin中定义静态扩展方法?这甚至可能吗?我目前有一个扩展方法,如下所示.

public fun Uber.doMagic(context: Context) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

可以在实例上调用上述扩展名.

uberInstance.doMagic(context) // Instance method
Run Code Online (Sandbox Code Playgroud)

但是如何使它成为静态方法,如下所示.

Uber.doMagic(context)         // Static or class method
Run Code Online (Sandbox Code Playgroud)

static-methods kotlin

125
推荐指数
5
解决办法
3万
查看次数

可以以"静态"方式调用扩展函数吗?

是否可以创建一个扩展函数并将其称为静态

例如...

fun System.sayByeAndExit() {
    println("Goodbye!")
    System.exit()
}

fun main(args: Array<String>) {
    System.sayByeAndExit() // I'd like to be able to call this
}
Run Code Online (Sandbox Code Playgroud)

我知道代码示例不起作用......

  • 我理解kotlin的扩展函数是静态解析的,Kotlin Reference(扩展函数)中所述,但这并不意味着它们可以被调用,就好像它们是类中的静态函数(在Java意义上).

  • 我也明白这个代码不起作用,因为没有 System的实例传递给编译器将生成的方法; 因此它不会编译.

我为什么要这个?

有些人可能想知道为什么这种行为是可取的.我能理解为什么你会认为不是,所以这里有一些原因:

  1. 它具有标准扩展功能带来的所有好处.
  2. 不需要 仅为访问额外功能而创建类的实例.
  3. 可以从系统范围的上下文访问这些函数(前提是该类是可见的).

总结一下......

Kotlin有办法将静态函数"挂钩"到类中吗?我很想知道.

kotlin extension-function

5
推荐指数
1
解决办法
965
查看次数

在Kotlin中创建扩展功能的前提条件

我正在学习科特林。据我了解,扩展功能提供了使用新功能扩展类的能力,而不必从类中继承。我正在为创建扩展功能okhttp3.RequestBody。但是我无法在自己的活动中获得方法。

这是我的扩展功能:

fun RequestBody.createPlainRequestBody(message: String): RequestBody = RequestBody.create(MediaType.parse("text/plain"), message)
Run Code Online (Sandbox Code Playgroud)

如下调用函数时,我得到了未解决的函数

RequestBody.createPlainRequestBody()
Run Code Online (Sandbox Code Playgroud)

当我为烤面包创建扩展功能时,我得到了如下完美的结果:

fun Context.showToast(message: String) {
    Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
}
Run Code Online (Sandbox Code Playgroud)

通过致电:

this@MainActivity.showToast("Upload successfully")
Run Code Online (Sandbox Code Playgroud)

可以提供任何指南来解决此问题吗?

extension-methods android kotlin

1
推荐指数
1
解决办法
66
查看次数