首页 > 解决方案 > 不能将 item.text 分配给 Android Studio 示例代码中的字符串吗?

问题描述

以下示例代码来自https://developer.android.com/guide/topics/text/copy-paste

示例代码似乎有一些错误,我必须替换pasteData = item.textpasteData = 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()

源代码

在此处输入图像描述

标签: androidkotlin

解决方案


如果你看一下代码,你会注意到它.text返回一个 CharSequence。这是问题:

  • 字符串继承自 CharSequence
  • 该方法返回一个 CharSequence
    • 但不一定是字符串

如中,text可以返回任何 CharSequence,不一定是 String。因此,这不是一个好主意:

pasteData = item.text as String

因为如果 CharSequence 不是字符串,它将抛出 ClassCastException。

这就是.toString()进来的地方。它将 CharSequence 转换为实际的字符串。此外,还有另外两个选项:

  1. String.valueOfpasteData = 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 是 CharSequence。如果您希望它作为字符串,您可以使用上述三个选项之一将其转换为一个。

或者,如果你想强制转换它,你总是可以使用is,但这意味着 CharSequence 的任何其他实现都不会像你期望的那样做;你不会得到你需要的字符串。


老实说,我不确定为什么它.text直接在文档中使用。可能是一个错误,或者 API 可能已从 String 更改为 CharSequence。无论哪种方式,您都需要对其进行转换。

TL;DR:是的,文档是错误的。


推荐阅读