我正在学习科特林。据我了解,扩展功能提供了使用新功能扩展类的能力,而不必从类中继承。我正在为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")
任何人都可以找到解决方法的指南吗?
答案 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
。