В чем разница между «toString» и «as String» в Котлине?

Я хочу получить текст View. Поэтому я проверяю, что представление было TextView и использовало v.text. В этой ситуации v.text равно Charsequence!. и я пытаюсь изменить v.text на String. У меня есть две ситуации, v.text.toString и v.text as String. Чем они отличаются?

override fun onClick(v: View?) {
        when(v) {
            is TextView -> {
                Log.d("v.text", v.text)
                // v.text is Charsequence but msg need String
            }
        }
    }

person KRMKGOLD    schedule 25.10.2019    source источник
comment
Поскольку этот вопрос касается as String, он не является дубликатом этого вопроса IMO.   -  person Enselic    schedule 25.10.2019
comment
Да, это не дублирующий вопрос.   -  person Tenfour04    schedule 25.10.2019
comment
почему мои вопросы дублируются??   -  person KRMKGOLD    schedule 28.10.2019


Ответы (2)


v.text as String означает "принудительно преобразовать v.text в String". Это приведет к сбою вашего приложения, если v.text окажется каким-то другим типом CharSequence, чем String, например. SpannedString. Несмотря на то, что во многих случаях это будет работать, поскольку v.text часто является String, это не то, что вам следует использовать.

v.text.toString() означает "вызов метода toString для объекта v.text". Это вернет String представление объекта, и это то, что вы должны использовать в этом случае.

Вот пример кода, демонстрирующий разницу:

v?.text = SpannedString("spanned string")

// Will print "v.text  : spanned string" to logcat
Log.d("v.text", v?.text.toString())

// Will crash with java.lang.ClassCastException: android.text.SpannedString cannot be cast to java.lang.String
Log.d("v.text", v?.text as String) 
person Enselic    schedule 25.10.2019

toString() — это разговор из типа Some в тип String.

as String — небезопасное литье, которое может вызвать ClassCastException.

person Antonis Radz    schedule 25.10.2019