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

时间:2019-06-28 08:39:22

标签: android kotlin extension-methods

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

这是我的扩展功能:

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

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

RequestBody.createPlainRequestBody()

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

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

通过致电:

this@MainActivity.showToast("Upload successfully")

任何人都可以找到解决方法的指南吗?

2 个答案:

答案 0 :(得分:5)

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

在这种情况下,您需要一个简单的函数来创建一个 -exec command {} + This variant of the -exec action runs the specified command on the selected files, but the command line is built by appending each selected file name at the end; the total number of invoca‐ matched files. The command line is built in much the same way that xargs builds its command lines. Only one instance of `{}' is allowed within the command, and (when find is being invoked from a shell) it should be quoted (for example, '{}') to protect it from interpretation by shells. The command is executed in the starting directory. If any invocation returns a non-zero value as exit status, then find returns a non-zero exit status. If find encounters an error, this can sometimes cause an immedi‐ ate exit, so some pending commands may not be run at all. This variant of -exec always returns true. ,因为您没有对RequestBody的任何特定实例进行操作。

在内部,扩展函数只是一个静态方法,其中第一个参数是接收器对象,而其他任何参数都移动一个。您的RequestBody扩展功能等效于以下Java代码段:

showToast

这就是为什么您可以从Java调用Kotlin扩展功能的原因。

答案 1 :(得分:1)

  

很遗憾,您无法在OkHttp第3版中执行此操作,但是,   将能够在OkHttp4中完成此操作,而fun RequestBody.Companion.createPlainRequestBody(message: String): RequestBody { return RequestBody.create(MediaType.parse("text/plain"), message) } 将被完全重写   Kotlin,因此所有类都将与Koltin兼容。

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

RequestBody.createPlainRequestBody("message")

然后,您将可以直接从其类中调用它。

RequestBody.Companion.createPlainRequestBody("message")

static

伴随对象是与Java的companion object对象相似或与之关联的普通对象。在Kotlin中,它称为scroll-snaps