【问题标题】:Prerequisite to create extension function in kotlin在 kotlin 中创建扩展函数的先决条件
【发布时间】:2019-06-28 08:39:22
【问题描述】:

我正在学习 Kotlin。据我所知,扩展函数提供了用新功能扩展类的能力,而无需从类继承。我正在为okhttp3.RequestBody 创建扩展函数。但我无法在我的活动中获得方法。

这是我的扩展功能:

fun RequestBody.createPlainRequestBody(message: String): RequestBody = RequestBody.create(MediaType.parse("text/plain"), message)

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

RequestBody.createPlainRequestBody()

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

fun Context.showToast(message: String) {
    Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
}

通过调用:

this@MainActivity.showToast("Upload successfully")

谁能指导一下如何解决这个问题?

【问题讨论】:

标签: android kotlin extension-methods


【解决方案1】:

扩展函数可以应用于特定类的实例,但您试图在一个类上调用它,就好像它是一个静态方法一样。此外,您的扩展函数需要一个参数,而您没有提供任何参数。

在您的情况下,您需要一个创建RequestBody 的简单函数,因为您没有对RequestBody 的任何特定实例进行操作。

在底层,扩展函数只是一个静态方法,其中第一个参数是接收器对象,任何其他参数都移动一个。你的showToast 扩展函数相当于下面的Java sn-p:

public static void showToast(Context receiver, String message) {
    Toast.makeText(receiver, message, ...).show();
}

这就是您可以从 Java 调用 Kotlin 扩展函数的原因。

【讨论】:

    【解决方案2】:

    很遗憾,您无法在 OkHttp 版本 3 中执行此操作,但是,您 将能够在OkHttp4 中完成此操作,该功能正在被完全重写 Kotlin,因此所有类都将与 Koltin 兼容。

    你必须扩展到它的伴生对象。 (您需要确保该类具有与之关联的伴随对象)

    fun RequestBody.Companion.createPlainRequestBody(message: String): RequestBody {
       return RequestBody.create(MediaType.parse("text/plain"), message)
    }
    

    之后,您将能够直接从其类中调用它。

    RequestBody.createPlainRequestBody("message")
    

    或者

    RequestBody.Companion.createPlainRequestBody("message")
    

    伴生对象是与类相关联或属于类的普通对象,类似于Java 中的static 对象。在 Kotlin 中,它被称为 companion object

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-20
    相关资源
    最近更新 更多