Kotlin与Java比较:泛型

2018-12-03  本文已影响1人  程序引力

前言

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

泛型概念

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

// java
int x;

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

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

泛型简单示例

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

型变

List<? extends T>
List<? super T>

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

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!
}
上一篇 下一篇

猜你喜欢

热点阅读