一、概念
用于限定实例持有的数据类型,在类/接口内部使用统一的数据类型,也保证了容器类写入的数据类型单一化,避免运行时的类型转换异常,传入其他数据类型在编译时期就会报错提示。
T 是一个占位符,实例化或传参的时候会被替换成具体的类型。<T>针对的是类,可以赋值为非泛型类或泛型类,Demo<T>针对的是类型,只能传入基础类型是Demo的泛型类。
Create<Animal>,Create叫做基础类型(原始类型),Animal叫做泛型类型(实参类型、参数类型)。方法的泛型可以单独定义,不一定要用包裹它的类/接口的。
//当类定义了泛型
class One<T> {
fun method1(param : String){} //普通方法,没必要出现
fun method2(param : T){} //使用类定义的泛型类型
fun <R> method3(param : R){} //使用自己单独定义的泛型类型
fun method4(param : Demo<T>){} //形参为泛型类的时候,使用类定义的泛型类型
fun <V> method5(param : Demo<V>){} //形参为泛型类的时候,使用自己定义的泛型类型
}
//当类未定义泛型
class Two{
fun method1(param : String){} //普通方法
fun method2(param : T){} //不存在这种东西,使用泛型见下一行
fun <R> method3(param : R){} //使用自己单独定义的泛型类型
fun method4(param : Demo<T>){} //不存在这种东西,使用泛型见下一行
fun <V> method5(param : Demo<V>){} //形参为泛型类的时候,使用自己定义的泛型类型
}
//使用
val list1 = listOf(1, 2, 3) //编译器能自动推算出Int类型
val list2: List<Long> = listOf(1, 2, 3)
val list3 = listOf<Long>(1, 2, 3)