android - 不能将 item.text 分配给 Android Studio 示例代码中的字符串吗?
问题描述
以下示例代码来自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()
源代码
解决方案
如果你看一下代码,你会注意到它.text
返回一个 CharSequence。这是问题:
- 字符串继承自 CharSequence
- 该方法返回一个 CharSequence
- 但不一定是字符串
如中,text
可以返回任何 CharSequence,不一定是 String。因此,这不是一个好主意:
pasteData = item.text as String
因为如果 CharSequence 不是字符串,它将抛出 ClassCastException。
这就是.toString()
进来的地方。它将 CharSequence 转换为实际的字符串。此外,还有另外两个选项:
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 是 CharSequence。如果您希望它作为字符串,您可以使用上述三个选项之一将其转换为一个。
或者,如果你想强制转换它,你总是可以使用is
,但这意味着 CharSequence 的任何其他实现都不会像你期望的那样做;你不会得到你需要的字符串。
老实说,我不确定为什么它.text
直接在文档中使用。可能是一个错误,或者 API 可能已从 String 更改为 CharSequence。无论哪种方式,您都需要对其进行转换。
TL;DR:是的,文档是错误的。
推荐阅读
- c# - 如何从函数返回转换的数据类型变量?
- r - 如何在 R 命令中使用迭代变量?
- javascript - 如何更改 vue-apexcharts 中的特定线条颜色,如 contidional 颜色更改?
- java - 如何覆盖 Kotlin 对象中的函数?
- python - 在 Open Cascade 中修改几何图形时,如何保留 STEP 文件中的颜色?
- amazon-web-services - AWS ECS 任务日志
- microsoft-graph-api - 图形 API 搜索缺少的扩展
- r - 一组一组的总和:group_by 总结
- android -
- c# - 如何将实现从单一行为中抽象出来?