【Kotlin】学习笔记(五)泛型

一、泛型方法

1
2
3
4
5
6
7
8
fun <T> fromJson(json: String, tClass: Class<T>): T? { /*可空返回值*/
val instance: T? = tClass.newInstance()
return instance
}

fun main() {
fromJson<String>("{}", String::class.java)
}

二、泛型接口/类

1.定义

定义泛型接口

1
2
3
4
interface Drinks<T> {
fun taste(): T
fun price(t: T)
}

定义泛型类

1
2
3
abstract class Color<T>(var t:T/*泛型字段*/) {
abstract fun printColor()
}

2.使用

继承泛型接口

1
2
3
4
5
class DrinkApple : Drink<String> {
override fun drink(t: String) {
print("drink:${s}")
}
}

继承泛型类

1
2
3
4
5
class BlueColor(val color: String) : Color<String>(color) {
override fun printColor() {
println("printColor:${color}")
}
}

三、泛型类型限定

可以将泛型的范围限定为某个类及其子类

1
2
3
4
5
6
7
8
9
10
11
//限定为JSONObject及其子类
fun <T: JSONObject> fromJson(json: String, tClass: Class<T>): T? { /*可空返回值*/
val instance: T? = tClass.newInstance()
return instance
}

//传入的类型必须同时满足where子句的所有条件
fun <T> fromJson(json: String, tClass: Class<T>): T? where T : User, T: Comparable<T>{
val instance: T? = tClass.newInstance()
return instance
}

使用 in, out关键字限定泛型类的上下限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
fun main() {
// Int 、 Long 都继承自Number
val l1 = ArrayList<Number>()
l1.add(23)
l1.add(1114)

val l2 = ArrayList<Long>()
l2.add(1515461515545)
l2.add(1114545124)

val k1: ArrayList<in Int> = l1
val k2: ArrayList<out Number> = l2

printArr(k1)
printArr(k2)

}

fun <T> printArr(arr : ArrayList<T>) {
for(n in arr) {
println(n)
}
}

【Kotlin】学习笔记(五)泛型
https://chordfish-k.github.io/2023/03/01/kotlin/kotlin-20230301/
作者
超弦鱼
发布于
2023年3月1日
许可协议