如何在Kotlin中将Any转换为Int

时间:2017-05-09 18:04:05

标签: kotlin

我的模型中定义了如上所述的属性,在某些情况下包含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

3 个答案:

答案 0 :(得分:13)

问题在于您尝试使用value as Int 直接从String转换为。

这不起作用,因为正如异常告诉你的那样,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