Андроид Котлин разница между ними.toString() и.строка()


У меня есть фрагмент кода:

    override fun onResponse(call: Call<ResponseBody>, response: Response<ResponseBody>) {
        try {
            Log.d("DEBUG POST=====>", response.body()!!.string())
        }catch(e:IOException) {
            e.printStackTrace()

        }

    }

Когда я использую response.body()!!.string(), я получаю правильный вывод и тело JSON.

Когда я использую: response.body().toString() я получаю okhttp3.ResponseBody$1@c626d25

Может ли кто-нибудь любезно сказать мне, в чем разница между этими двумя методами?
2 3

2 ответа:

string() не является допустимым методом Kotlin (или Java), так как ни в одном из языков его не определяют. Он определяется Охттп в ResponseBody и это правильный способ получить фактическое строковое значение класса. он не переопределяет toString, что означает, что вызовы toString() переходят к Object, который возвращает объект в виде, подобном полученному вами. Чтобы быть точным, он возвращает шестнадцатеричное представление объекта.

TL: DR; Java или Kotlin не определяют метод string(), библиотека Ohttp делает это в класс ResponseBody. toString не переопределяется, что делает его возвращающим шестнадцатеричное представление класса вместо строкового значения тела. Используйте string(), а не toString()

В соответствии с документацией для ответа Охттп , функция string():

Возвращает ответ в виде строки, декодированной с помощью кодировки заголовка Content-Type. Если этот заголовок отсутствует или отсутствует кодировка, то будет предпринята попытка декодировать тело ответа в соответствии с его BOM или UTF-8. Закрывает ResponseBody автоматически.

Напротив, Метод toString(), который находится на всех объектах Java/Kotlin, в этом случае не определен для ResponseBody. В в этом случае вместо него будет вызвана версия на java.lang.Object, и стандартная реализация для этого должна выдавать имя класса объекта и хэш-код объекта (как hex).

Из JavaDoc для Object.toString():

Возвращает строковое представление объекта. В общем случае метод toString возвращает строку, которая "текстуально представляет" этот объект. Результатом должно быть краткое, но информативное представление, которое легко читается человеком. Рекомендуется, чтобы все подклассы переопределяют этот метод.

Метод toString для объекта класса возвращает строку, состоящую из имени класса, экземпляром которого является объект, символа at-sign ` @ ' и беззнакового шестнадцатеричного представления хэш-кода объекта. Другими словами, этот метод возвращает строку, равную значению:
getClass().getName() + '@' + Integer.toHexString(hashCode())
Короче говоря, эти методы намеренно делают разные вещи.