Если вы посмотрите на код, вы заметите, что .text
возвращает CharSequence. Вот проблема:
- Строка наследуется от CharSequence
- Метод возвращает CharSequence
Как и в случае, text
может возвращать любую CharSequence, не обязательно String. В результате это не очень хорошая идея:
pasteData = item.text as String
Потому что он вызовет исключение ClassCastException, если CharSequence не является String.
Вот тут и появляется .toString()
. Он преобразует последовательность Char в фактическую строку. Кроме того, есть два других варианта:
String.valueOf
: pasteData = String.valueOf(item.text)
StringBuilder
: pasteData = StringBuilder().append(item.text).toString()
.
Причина этого кроется в наследовании. Учтите это:
fun someFunction (arg: Int) : CharSequence {
if(arg < 0) return "This is a String";
return SomeCustomCharSequenceImpl("Inheritance", 42);
}
Теперь, если вы вызовете это:
val string: String = someFunction(Random().nextInt()); // The random init is not memory efficient, but it's just for a complete demo
Он не скомпилируется, потому что CharSequence не обязательно является String. Метод работает, потому что String является CharSequence. Если вы хотите использовать его в качестве строки, вы можете преобразовать его в один из трех вариантов выше.
В качестве альтернативы, если вы хотите привести его, вы всегда можете использовать is
, но это означает, что любые другие реализации CharSequence не будут делать то, что вы ожидаете; вы не получите нужную вам строку.
Я, честно говоря, не уверен, почему он использует .text
непосредственно в документации. Может быть ошибка, или API мог измениться с String на CharSequence. В любом случае, вам нужно конвертировать его.
TL; DR: Да, документы неверны.