我的模型中有一个如上定义的属性,在某些情况下包含一个 Int。
var value: Any?
我知道如果我先转换为 String,然后转换为 Int,我可以做到
value.toString().toInt() // works
有没有办法通过之前跳过转换为字符串来做到这一点? 当我尝试直接转换为 Int 时,出现此错误
FATAL EXCEPTION: main
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
最佳答案
问题是您试图使用 value as Int
将字符串直接转换 到 Int。 .
这不起作用,因为正如异常告诉你的那样,value
包含一个字符串,并且不能将一个字符串强制转换为一个 Int。这个字符串表示一个整数的事实并不重要,因为它需要被解析成一个 Int。这正是 toInt()
方法可以。
您必须首先转换为字符串的原因是因为 toInt()
是 String 的扩展方法,value
是 Any?
类型.这意味着您不能调用toInt()
直接上value
因为它在编译时不知道它包含一个字符串,即使它在运行时也是如此。如果你想跳过这一步,你也可以先检查类型来使用智能转换:
if (value is String) {
value.toInt()
}
您可以在此处找到有关智能转换和其他 Kotlin 类型转换的更多信息:https://kotlinlang.org/docs/reference/typecasts.html#smart-casts
这也可能指向潜在的设计问题。您希望它有时包含一个 Int,但正如我们在这里看到的,在您的模型中设置此值的任何内容都是将其设置为包含该数字的字符串。您是否希望这个值真正能够包含许多不同的类型,或者您只希望 Int 和 String?如果是后者,那么将其设为 String 而不是 Any?
可能是更好的设计决策。 .这将防止提供意外/未处理的类型,并使模型对任何查看或使用它的人来说不那么模棱两可。
关于kotlin - 如何在 Kotlin 中将 Any 转换为 Int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43876910/