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

发布于 2022-09-13 01:17:41 字数 763 浏览 21 评论 0

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>的子类型
但是在函数调用时,判断这个类型是否合法的这个过程是在哪里完成的,编译的时候吗?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

梦行七里 2022-09-20 01:17:41

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

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

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文