Kotlin-具有溢出异常的类型转换

Kotlin-具有溢出异常的类型转换,kotlin,type-conversion,Kotlin,Type Conversion,(123L).toInt()产生123但长.MAX\u值.toInt()产生-1。这显然是不对的。无需编写大量样板代码,有没有办法让Kotlin在值超出目标类型的范围/界限时引发异常?如果您在JVM上运行,您可以使用: 返回长参数的值;如果值溢出int,则引发异常 似乎没有一种纯粹的Kotlin方式,但至少你可以很好地包装它: fun Long.toIntExact() = Math.toIntExact(this) TL;DR您可以创建一个自定义扩展函数,用于检查值是否介于Int.MIN_值

(123L).toInt()
产生
123
长.MAX\u值.toInt()
产生
-1
。这显然是不对的。无需编写大量样板代码,有没有办法让Kotlin在值超出目标类型的范围/界限时引发异常?

如果您在JVM上运行,您可以使用:

返回长参数的值;如果值溢出int,则引发异常

似乎没有一种纯粹的Kotlin方式,但至少你可以很好地包装它:

fun Long.toIntExact() = Math.toIntExact(this)

TL;DR您可以创建一个自定义扩展函数,用于检查值是否介于Int.MIN_值和Int.MAX_值之间

fun Long.toIntThrowing() : Int {
    if (this < Int.MIN_VALUE || this > Int.MAX_VALUE) {
        throw RuntimeException()
    }

    return this.toInt()
}
结果:

2147483647
-2147483648
-2147483647
-2
-1
发件人:

算术溢出异常:这可能会使算术运算速度大大降低,如果不改变JVM,我们看不到如何避免它,我们也不准备接受这种降低

显然这是不对的
toInt()
完成了它的设计任务:“生成的
Int
值由该
Long
值的最低有效32位表示”,并且不会引发异常,但您可以编写一个扩展函数来实现这一点。
2147483647
-2147483648
-2147483647
-2
-1