Kotlin中的泛型型变,以逆变为例的一点疑惑

public interface Comparable<in T> {
    public operator fun compareTo(other: T): Int
}
fun main(args: Array<String>) {

    val intComparable = Comparable<Int>{
        ....
    }
    val anyComparable = Comparable<Any>{
        ....
    }
    sortWithComparator(intComparable)//不合法,
    sortWithComparator(anyComparable)//合法
}

fun sortWithComparator(comparator: Comparable<Number>){
    ....
}

目前已经知道,逆变所对应子类型化关系的特性
现在从逆变的作用上来看,对于函数sortWithComparator,传入Comparable<Any>合法,而Comparable<Int>不合法,
Number是Any的子类型,因为逆变,
所以Comparable<Any>是Comparable<Number>的子类型
但是在函数调用时,判断这个类型是否合法的这个过程是在哪里完成的,编译的时候吗?

阅读 1.3k
1 个回答

从题主的几个问题来看,我猜你是没有学过 Java、而是直接上手的 Kotlin?

Kotlin 也好、Java 也罢,最后都得跑在 JVM 上。也就是抛开语法上的差异,底层上 Kotlin 和 Java 是互通的。

回到问题上,直接说答案:在编译时检查,编译后就类型擦除了。

感兴趣原理可以自己搜索“Kotlin 泛型类型擦除”。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进