2-知识点汇总
1、如何使用泛型
//类似Java的声明
class Box<T>(t: T) {
var value = t
}
val box: Box<Int> = Box<Int>(1) //完整形式
val box = Box(1) //可推测出时,可以省略参数类型。
2、和Java区别
- Java有通配符(wildcard type),Kotlin没有
- Kotlin中有declaration-site variance(声明-位置 变化量)和type projections(类型预测)
3、Java中的泛型
- Java中泛型是不变量:List不是List的子类
- Java中应该使用泛型限制List<? extends E>,使得List是其子类。
- List
fun copy(from: Array<out Any>, to: Array<Any>) {
// ...
}
表明from不仅是数组,而且是被保护的。
7、使用点变化量:相反于形如Java中Array
fun fill(dest: Array<in String>, value: String) {
// ...
}
这等于Array<? super Object>
,可以传入CharSequence或者object的数组。
8、‘*’星号预测
!!!!!
9、泛型函数
一般泛型函数:泛型在函数名前
fun <T> singletonList(item: T): List<T> {
// ...
}
扩展函数:T.fun()
fun <T> T.basicToString() : String { //扩展函数
// ...
}
10、泛型的限制:Upper bounds
fun <T : Comparable<T>> sort(list: List<T>) {
// ...
}
T必须为Comparable的子类。
11、需要两个及以上限制:
使用where包含
fun <T> copyWhenGreater(list: List<T>, threshold: T): List<String>
where T : CharSequence, //两个限制
T : Comparable<T> {
return list.filter { it > threshold }.map { it.toString() }
}