与 java 一样,kotlin 的泛型用来表示变量类型的参数化。一个简单的泛型类定义使用样例:
class Generics(t: T) {
var tmp: T = t
}
/**
运行结果:
class java.lang.String
class cn.yan.test.Generics
class java.lang.String
class cn.yan.test.Generics
*/
fun testRun() {
val generics: Generics = Generics(“666”)
println(generics.tmp.javaClass)
println(generics.javaClass)
//不像 java 没有<>就是 Object,kotlin 这里可以自动依据构造参数类型推断出是 String 类型
val generics1 = Generics(“666”)
println(generics1.tmp.javaClass)
println(generics1.javaClass)
}
一个简单的泛型函数定义如下:
//泛型函数的定义声明
fun get(t: T): T = t
/**
调用
*/
fun testRun() {
val v1 = get(“1233”)
val v2 = get(12)
val v3 = get(“1233”) //等价于v1,自动推断
}
泛型约束之协变(covariant)与逆变(controvariant)
关于泛型协变与逆变概念其实来自 java,在我们深入搞懂 kotlin 的泛型之前,我们有必要先巩固下 java 的泛型协变与逆变。以 java 代码为例子:
//【工匠若水 加微信 yanbo373131686 联系我,关注微信公众号:码农每日一题 未经允许严禁转载 https://blog.csdn.net/yanbober】
//java 代码
//表示可以往这个泛型集合放置任何类型对象
List
//表示可以往这个泛型集合只能放置String对象
List
//在 java 中不能把 List 类型变量赋值给 List,因为他们不是父子类关系
List list1 = new ArrayList();
//假设如果这么做被允许,则我们做如下代码,list2.add(new Date()); String str = list.get(0); 这会导致类型转换异常。
List list2 = list1; //编译失败
我们知道,在 java 中为了解决上面赋值问题,其提供了类型通配符的概念。如下是一个