美文网首页
Kotlin与Java比较:泛型

Kotlin与Java比较:泛型

作者: 程序引力 | 来源:发表于2018-12-03 23:45 被阅读1次

    前言

    Kotlin作为JVM系的语言,起源于Java又不同于Java。通过在语言层面比较两者的区别,可以使得开发者能够快速学习,融会贯通。

    泛型概念

    泛型,即参数化类型。何为参数化类型?在学习泛型前,开发者都对如下形式的声明了如指掌:

    // java
    int x;
    

    这表示,x这一变量的类型是int,但是其值是变化的。也就是说,这一变量,它的类型是固定的,但是值是不定的。

    那读者可能会问,那类型可以是不定的吗?答案是可以。这就是泛型。泛型就是对于一个变量,它的类型(或者说处理的类型)是不定的,这就是泛型。

    泛型简单示例

    • Java
    public class Box<T>(T t) {
        T value = t
    }
    
    • Kotlin
    // 声明泛型
    class Box<T>(t: T) {
        var value = t
    }
    // 使用泛型
    val box: Box<Int> = Box<Int>(1)
    

    型变

    • Java
      在Java中,支持通配符类型参数,其示例为:
    List<? extends T>
    List<? super T>
    

    前者表示接受T或者T的子类的对象,后者表示接受T或者T的父类的对象。即extends限定了上界,此种通配符类型被称为协变的。而super限定了下界,这种通配符类型被称为逆变的。

    • Kotlin
      在Kotlin中使用out与in关键字来达到类似的效果。
    interface Source<out T> {
        fun nextT(): T
    }
    
    fun demo(strs: Source<String>) {
        val objects: Source<Any> = strs // 这个没问题,因为 T 是一个 out-参数
        // ……
    }
    
    interface Comparable<in T> {
        operator fun compareTo(other: T): Int
    }
    
    fun demo(x: Comparable<Number>) {
        x.compareTo(1.0) // 1.0 拥有类型 Double,它是 Number 的子类型
        // 因此,我们可以将 x 赋给类型为 Comparable <Double> 的变量
        val y: Comparable<Double> = x // OK!
    }
    

    相关文章

      网友评论

          本文标题:Kotlin与Java比较:泛型

          本文链接:https://www.haomeiwen.com/subject/hlrpcqtx.html