目录
摘要
定义泛型,使用泛型,in 与 out,逆变与协变,集合的边界
泛型
定义泛型
class Holder<T>(val t: T) {
fun info() {
println(t)
}
}
使用泛型
var strHolder = Holder("a")
var intHolder = Holder(3)
strHolder.info() // a
intHolder.info() // 3
In 和 Out
Out
参数注解 out
用于表示该泛型只能用于输出,例如作为返回值。同时也提供了协变的特性。
abstract class Source<out T> {
abstract fun nextT(): T
}
协变特性
fun demo(strs: Source<String>) {
val obj: Source<Any> = strs
}
In
参数注解 in
用于表示该泛型只能用于输入,例如作为参数。同时也提供了逆变的特性。
abstract class Comparable<in T> {
abstract fun compareTo(other: T): Int
}
逆变特性
fun demo(x: Comparable<Number>) {
val y: Comparable<Double> = x
}
集合的边界
Java 中集合作为参数时可以指定边界,Kotlin 中也有类似的做法
Array<in String>
以上类似 Java 中的 Array<? super String>
Array<out String>
以上类似 Java 中的 Array<? extend String>