import kotlin.collections.* @CompileTimeCalculation fun foo(): String { return if (listOf() as? T == null) "Can't cast" else "Safe cast" } @CompileTimeCalculation inline fun bar(): String { return if (listOf() as? T == null) "Can't cast" else "Safe cast" } inline fun arrayCast(vararg t: T): Array = t as Array const val a1 = foo() const val a2 = foo() const val a3 = foo() const val a4 = foo>() const val a5 = foo>() const val b1 = bar() const val b2 = bar() const val b3 = bar() const val b4 = bar>() const val b5 = bar>() const val b6 = bar>() const val c1 = arrayOf(1, 2, 3) as? Array == null const val c2 = arrayOf(1, 2, 3) as? Array == null const val c3 = arrayOf(listOf(1, 2), listOf(2, 3)) as? Array?> == null const val c4 = arrayOf>(listOf(1, 2), listOf(2, 3)) as? Array?> == null const val c5 = arrayOf>(listOf(1, 2), listOf(2, 3)) as? Array> == null const val c6 = arrayOf>(listOf(1, 2), listOf(2, 3)) as? Array> == null const val c7 = Array>(3) { listOf(it, it + 1) } as? Array?> == null const val c8 = Array>(3) { listOf(it, it + 1) } as? Array> == null const val d1 = arrayCast(arrayOf(1, 2, 3)).size const val d2 = arrayCast(*arrayOf(1, 2, 3)).size const val d3 = arrayCast(1, 2, 3).size