如何在Kotlin中将Any转换为Int

我在我的模型中定义了一个属性,在某些情况下包含一个Int。

var value: Any? 

我知道我可以做到这一点,如果我首先投掷字符串,然后到诠释

 value.toString().toInt() // works 

有没有办法通过跳过铸造字符串之前呢? 当我尝试直接投入到一个INT我得到这个错误

 FATAL EXCEPTION: main Process: com.pablo.test, PID: 5033 java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer 

问题是,你试图直接从一个字符串转换为Int value as Int Int的value as Int

这是行不通的,因为,例外是告诉你, value包含一个字符串,并且一个字符串不能被强制到一个Int。 这个String代表一个整数的事实并不重要,因为它需要被解析成一个Int。 这正是toInt()方法的作用。

您必须首先toInt()转换为字符串的原因是因为toInt()是String上的扩展方法,并且value的类型为Any? 。 这意味着你不能在value直接调用toInt() ,因为它不知道它在编译时包含一个String,即使它在运行时也是如此。 如果你想跳过这一步,你也可以通过首先检查类型来使用智能转换:

 if (value is String) { value.toInt() } 

你可以在这里找到更多有关智能转换和其他Kotlin类型转换的信息: https : //kotlinlang.org/docs/reference/typecasts.html#smart-casts

这也可能指向一个潜在的设计问题。 你期望这有时会包含一个Int,但正如我们在这里可以看到的那样,无论在你的模型中设置这个值是把它设置为一个包含该数字的字符串。 你是否期望这个值真正能够包含许多不同的类型,或者你只期望Int和String? 如果是后者,那么这可能是一个更好的设计决定,使这个字符串,而不是一个Any? 。 这将防止意外/未处理的类型被提供,并且使得模型对于任何正在查看或使用它的人来说都不那么模糊。