型变注解的底层协变保证与 unsafeVariance 陷阱
探究 @UnsafeVariance 注解如何绕过 Kotlin 类型检查,以及在实际协变/逆变使用中的深层风险。 · 难度:入门 · +10XP
型变注解的底层协变保证与 unsafeVariance 陷阱
Kotlin 的声明点型变通过 out/in 提供了类型安全。但有时为了代码简洁或与 Java 互操作,开发者会使用 @UnsafeVariance 强制跳过编译器检查。本教程详细解释此注解的实际行为——它只是抑制警告,并不生成任何字节码,因此可能引起运行时 ClassCastException。我们将通过一个自定义的 Producer/Consumer 例子演示何时必须使用以及如何防御。
interface ListProducer {
fun produce(): T
}
class UnsafeProducer : ListProducer {
override fun produce(): T {
@Suppress("UNCHECKED_CAST")
return "String" as T // 实际运行时可能崩溃
}
}
fun main() {
val p: ListProducer = UnsafeProducer()
// 这里虽然用 @UnsafeVariance 编译通过,但运行时抛出 ClassCastException
println(p.produce() + 1)
}