Обязательное условие для создания функции расширения в kotlin - PullRequest
1 голос
/ 28 июня 2019

Я учу Котлин.Как я узнал, функции расширения предоставляют возможность расширять класс новыми функциями без необходимости наследования от класса.Я создаю функцию расширения для 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 ]

5 голосов
/ 28 июня 2019

Функции расширения могут применяться к экземплярам определенного класса, но вы пытаетесь вызвать его в классе, как если бы это был статический метод.Более того, ваша функция расширения ожидает аргумент, а вы не предоставляете ее.

В вашем случае вам нужна простая функция, которая создает RequestBody, поскольку вы не действуете ни на один конкретный экземпляр RequestBody.

Под капотом функция расширения - это просто статический метод, где первый аргумент является объектом-получателем, а любой другой аргумент сдвигается на единицу.Ваша функция расширения showToast эквивалентна следующему фрагменту Java:

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

Именно поэтому вы можете вызывать функции расширения Kotlin из Java.

1 голос
/ 28 июня 2019

К сожалению, вы не можете сделать это в 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")

Сопутствующий объект - это обычный объект, связанный с классом или принадлежащий ему, который похож на объект static в Java. В Котлине это называется companion object.

...