Kotlin与Java比较:泛型

前言

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

泛型概念

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

// java
int x;

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

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

泛型简单示例

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

型变

  • Java
    在Java中,支持通配符类型参数,其示例为:
List
List

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

  • Kotlin
    在Kotlin中使用out与in关键字来达到类似的效果。
interface Source {
    fun nextT(): T
}

fun demo(strs: Source) {
    val objects: Source = strs // 这个没问题,因为 T 是一个 out-参数
    // ……
}
interface Comparable {
    operator fun compareTo(other: T): Int
}

fun demo(x: Comparable) {
    x.compareTo(1.0) // 1.0 拥有类型 Double,它是 Number 的子类型
    // 因此,我们可以将 x 赋给类型为 Comparable  的变量
    val y: Comparable = x // OK!
}

你可能感兴趣的:(Kotlin与Java比较:泛型)