如何将Kotlin中的任意值转换为Int

如何将Kotlin中的任意值转换为Int,kotlin,Kotlin,我的模型中有一个属性,定义如上,在某些情况下包含Int var value: Any? 我知道,如果我先将其转换为字符串,然后再转换为Int,我就可以做到这一点 value.toString().toInt() // works 有没有一种方法可以做到这一点,在之前跳过对字符串的转换? 当我试图直接转换为Int时,我得到了这个错误 FATAL EXCEPTION: main java.lang.ClassCastException: java.lang.String cannot be ca

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

var value: Any?
我知道,如果我先将其转换为字符串,然后再转换为Int,我就可以做到这一点

value.toString().toInt() // works
有没有一种方法可以做到这一点,在之前跳过对字符串的转换? 当我试图直接转换为Int时,我得到了这个错误

FATAL EXCEPTION: main
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer

问题是您试图直接从字符串转换为Int值为Int的Int

这不起作用,因为正如异常告诉您的那样,
value
包含一个字符串,不能将字符串强制转换为Int。这个字符串表示整数这一事实无关紧要,因为它需要解析为Int。这正是
toInt()
方法所做的

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

if (value is String) {
    value.toInt()
}
您可以在此处找到有关智能强制转换和其他Kotlin类型强制转换的更多信息:


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

我们可以使用Kotlin的
toInt()
toIntOrNull()
方法将字符串转换为Int类型。例如:

fun giveString(): String {
    return "12"
}

fun giveInt(): Int {
    return giveString().toInt()  // here we are casting return type to Int
}
下面我们将return tye强制转换为
Int
如果字符串不可转换,将返回
null

fun giveNullableInt(): Int? {
    return giveString().toIntOrNull()
}

我就是这样做的:

val myInt=值为?Int?:默认值


这将尝试将值转换为int,但如果失败,将使用
defaultValue

您所说的“尝试直接转换为int”是什么意思?我看不到这里的代码。您只是想做:
value.toInt()
?或者您正在尝试显式转换:
(Integer)value
?从示例来看,调用
value
var
似乎有时包含包含Int的字符串。如果是这种情况,您必须首先将其转换为String,然后使用
toInt
方法对其进行解析,就像你已经做的那样。@PseudoPsyche我正在尝试做value as IntIf你做
value as?Int
,则结果将安全转换为
Int?
(如果值是
Int
,则结果将是值,否则结果将是
null
。感谢您的解释。值可以是字符串、Int或其他数据类型。我的模型的这一部分肯定需要修改。@pablobu我稍微更新了答案,以反映您正在做的事情,并建议进行智能转换。如果您愿意,我将对于多个数据类型,每个接受类型的智能强制转换将是避免进入意外状态的最佳方法。@PseudoPsyche在同一行中,如何在Kotlin中将Any转换为LinkedTreeMap?正确,但在问题中,变量类型不是字符串,这就是为什么我们需要首先检查它是否是字符串,如@PseudoPsyc中所示他回答。