我的模型中定义了如上所述的属性,在某些情况下包含Int。
var value: Any?
我知道如果我首先转换为String然后转换为Int
,我可以这样做value.toString().toInt() // works
有没有办法通过在之前跳转到String中来实现呢? 当我尝试直接转换为Int时,我得到此错误
FATAL EXCEPTION: main
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
答案 0 :(得分:13)
问题在于您尝试使用value as Int
这不起作用,因为正如异常告诉你的那样,value
包含一个String,并且String不能被强制转换为Int。此String表示整数的事实并不重要,因为它需要解析为Int。这正是toInt()
方法的作用。
首先必须强制转换为String的原因是因为toInt()
是String的扩展方法,value
的类型为Any?
。这意味着您无法直接在toInt()
上调用value
,因为它不知道它在编译时包含String,即使它在运行时也是如此。如果您想跳过此步骤,您还可以通过首先检查类型来使用智能强制转换:
if (value is String) {
value.toInt()
}
您可以在此处找到有关智能模型和其他Kotlin类型转换的更多信息:https://kotlinlang.org/docs/reference/typecasts.html#smart-casts
这也可能指向潜在的设计问题。您希望有时包含一个Int,但正如我们在这里看到的那样,在模型中设置此值的任何设置都是将其设置为包含该数字的String。您是否希望此值真正能够包含许多不同类型,或者您只期望Int和String?如果是后者,那么将它设为字符串而不是Any?
可能是更好的设计决策。这样可以防止提供意外/未处理的类型,并使模型对于任何查看或使用它的人来说都不那么模糊。
答案 1 :(得分:0)
我们可以使用Kotlin的toInt()
或toIntOrNull()
方法将字符串转换为 Int 类型。例如:
fun giveString(): String {
return "12"
}
fun giveInt(): Int {
return giveString().toInt() // here we are casting return type to Int
}
下面,如果字符串不可转换,我们将返回tye强制转换为Int
null
答案 2 :(得分:0)
这是我的方法:
SELECT month_of_project, COUNT(emp_id)
FROM employees
GROUP BY month_of_project
这将尝试将值转换为int,但如果失败,将改为使用val myInt = value as? Int ?: defaultValue
。