import kotlin.* import kotlin.collections.* @CompileTimeCalculation fun classCastWithException(a: Any): String { return try { a as Int "Given value is $a and its doubled value is ${2 * a}" } catch (e: ClassCastException) { "Given value isnt't Int; Exception message: \"${e.message}\"" } } @CompileTimeCalculation fun safeClassCast(a: Any): Int { return (a as? String)?.length ?: -1 } @CompileTimeCalculation fun unsafeClassCast(): T { return 1 as T } @CompileTimeCalculation fun getIntList() = listOf(1, 2) as T @CompileTimeCalculation fun getStringNullableList() = listOf(null, "1") as T @CompileTimeCalculation fun getLength(str: String) = str.length @CompileTimeCalculation class A() { fun unsafeCast(): T { return 1 as T } } const val a1 = classCastWithException(10) const val a2 = classCastWithException("10") const val b1 = safeClassCast(10) const val b2 = safeClassCast("10") // in this example all unsafe cast will be "successful", but will fall when trying to assign const val c1 = unsafeClassCast() const val c2 = (classCastException.kt:48)`!>unsafeClassCast() const val d1 = A().unsafeCast() const val d2 = (classCastException.kt:51)`!>A().unsafeCast() const val stringList = (classCastException.kt:54) at ClassCastExceptionKt.stringList.Function$0.invoke(classCastException.kt:0) at StandardKt.kotlin.let(Standard.kt:32) at ClassCastExceptionKt.(classCastException.kt:53)`!>getIntList>().let { it[0].length } const val nullableStringList = (classCastException.kt) at ClassCastExceptionKt.nullableStringList.Function$0.invoke(classCastException.kt:0) at StandardKt.kotlin.let(Standard.kt:32) at ClassCastExceptionKt.(classCastException.kt:56)`!>getStringNullableList>().let { it[0].length } const val nullableStringLength = (classCastException.kt:31)`!>getLength(getStringNullableList>()[0])