前言
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!
}