Не может ли item.text быть назначен строке в образце кода Android Studio? - PullRequest
0 голосов
/ 08 ноября 2018

Следующий пример кода от https://developer.android.com/guide/topics/text/copy-paste

Кажется, что в примере кода есть ошибки, я должен заменить pasteData = item.text на pasteData = item.text.tostring().

Неправильный ли пример кода?

Пример кода

var clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
var pasteData: String = ""

val item = clipboard.primaryClip.getItemAt(0)

// Gets the clipboard as text.
pasteData = item.text  // It's Wrong, I have to use pasteData = item.text.tostring()

Исходный код

enter image description here

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Если вы посмотрите на код, вы заметите, что .text возвращает CharSequence. Вот проблема:

  • Строка наследуется от CharSequence
  • Метод возвращает CharSequence
    • Но не обязательно строка

Как и в случае, text может возвращать любую CharSequence, не обязательно String. В результате это не очень хорошая идея:

pasteData = item.text as String

Потому что он вызовет исключение ClassCastException, если CharSequence не является String.

Вот тут и появляется .toString(). Он преобразует последовательность Char в фактическую строку. Кроме того, есть два других варианта:

  1. String.valueOf: pasteData = String.valueOf(item.text)
  2. 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: Да, документы неверны.

0 голосов
/ 08 ноября 2018

Это может быть неправильно в реальном мире, потому что у нас может быть много типов из буфера обмена.Но в этом примере они уже отмечают (под номером 3): «Следующий фрагмент кода проверяет это, но показывает только код для обработки простого текста».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...