我在上面定义的模型中有一个属性,在某些情况下包含一个Int.
var value: Any?
Run Code Online (Sandbox Code Playgroud)
我知道如果我先将字符串转换为String然后转换为Int,我就可以执行此操作
value.toString().toInt() // works
Run Code Online (Sandbox Code Playgroud)
有没有办法通过在之前跳转到一个字符串来做到这一点?当我尝试直接转换为Int时,我得到了这个错误
FATAL EXCEPTION: main
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
Run Code Online (Sandbox Code Playgroud)
Pse*_*che 15
问题是,你试图投从字符串直接为int value as Int.
这是行不通的,因为正如异常告诉你的那样,它value包含一个String,并且String不能被强制转换为Int.此String表示整数的事实并不重要,因为它需要解析为Int.这正是该toInt()方法的作用.
首先必须强制转换为String的原因是因为它toInt()是String 上的扩展方法,并且value是类型的Any?.这意味着您无法toInt()直接调用,value因为它不知道它在编译时包含String,即使它在运行时也是如此.如果您想跳过此步骤,您还可以通过首先检查类型来使用智能强制转换:
if (value is String) {
value.toInt()
}
Run Code Online (Sandbox Code Playgroud)
你可以在这里找到关于智能模型和其他Kotlin类型转换的更多信息:https://kotlinlang.org/docs/reference/typecasts.html#smart-casts
这也可能指向潜在的设计问题.您希望这有时会包含一个Int,但正如我们在这里看到的那样,无论在模型中设置此值,都将其设置为包含该数字的String.您是否希望此值真正能够包含许多不同类型,或者您只期望Int和String?如果是后者,则可能是一个更好的设计决策,使它成为一个字符串而不是一个Any?.这样可以防止提供意外/未处理的类型,并使模型对于任何查看或使用它的人来说都不那么模糊.
小智 6
这是我这样做的方式:
val myInt = value as? Int ?: defaultValue
这将尝试将 value 转换为 int,但如果失败,将defaultValue改为使用。
| 归档时间: |
|
| 查看次数: |
12351 次 |
| 最近记录: |