泛型是强大的函数,允许定义类,方法和属性等,可以使用不同的类型进行访问。在编译时检查类,方法等的类型差异。
泛型类型类或方法被声明为参数化类型。参数化类型是具有实际类型参数的泛型类型的实例。使用尖括号<>声明参数化类型。泛型通常在集合中使用。
让无涯教程看看不使用泛型的问题。
在此示例中,无涯教程创建了一个Person类,其主构造函数具有单个参数。现在,无涯教程要在Person类的对象中传递不同类型的数据(例如,将Int类型作为Person(30),将String类型作为Person(“ 40”))。 Person类的主要构造函数接受Int类型的Person(30),而后悔String类型的Person(“ 40”)。它会由于类型不匹配而产生编译时错误。
class Person (age:Int){ var age: Int = age init { this.age= age println(age) } } fun main(args: Array<String>){ var ageInt: Person = Person(30) var ageString: Person = Person("30")// 编译时错误 }
为了解决上述问题,无涯教程使用通用类型类,它是用户定义的类,它在单个类中接受不同类型的参数。
让无涯教程使用泛型类型重写上面的代码。类型为<T>的Person类是通用类型的类,它接受Int和String类型的参数。
换句话说,类型参数<T>是一个占位符,将由类型实参替换。当实例化泛型类型时,它将被替换。
class Person<T>(age: T){ var age: T = age init { this.age= age println(age) } } fun main(args: Array<String>){ var ageInt: Person<Int> = Person<Int>(30) var ageString: Person<String> = Person<String>("40") }
输出:
30 40
在上面的示例中,当使用Int类型作为Person <Int>(30)和Person <String>(“ 40”)创建Person类的对象时,它将分别用Int和String替换类型T的Person类。
泛型类的语法
class_or_interface<Type>
泛型方法的语法
<Type>methodName(parameter: classType<Type>)
让无涯教程看一个通用方法的例子。在此示例中,无涯教程将访问集合类型(ArrayList)的通用方法。为此,无涯教程分别创建了StringList和Float类型的ArrayList类arrayListOf <String>(“ Ashu”,“ Ajay”)和arrayListOf <Float>(10.5f,5.0f,25.5f)的两个不同的对象。当无涯教程使用printValue(stringList)调用通用方法<T> printValue(list:ArrayList <T>)时,方法<T> printValue(list:ArrayList <T>)的类型T将替换为String类型。同样,当无涯教程使用printValue(floatList)调用通用方法时,方法<T> printValue(list:ArrayList <T>)的类型T将被Float类型替换。
fun main(args: Array<String>){ val stringList: ArrayList<String> = arrayListOf<String>("Ashu","Ajay") val s: String = stringList[0] println("printing the string value of stringList: $s") printValue(stringList) val floatList: ArrayList<Float> = arrayListOf<Float>(10.5f,5.0f,25.5f) printValue(floatList) } fun <T>printValue(list: ArrayList<T>){ for(element in list){ println(element) } }
输出:
printing the string value of stringList: Ashu Ashu Ajay 10.5 5.0 25.5
由于扩展函数允许在不继承类或任何设计模式的情况下向类添加方法。
在此示例中,无涯教程向通用类型的ArrayList类添加了一个方法printValue()。此方法分别称为String和Float类型的stringList.printValue()和floatList.printValue()形式。扩展函数中的“ this”关键字代表当前的调用实例。当无涯教程使用stringList.printValue()调用扩展函数时,这表示包含String类型值的stringList实例。同样,使用floatList.printValue()调用扩展函数,这表示包含Float类型值的floatList实例。
fun main(args: Array<String>){ val stringList: ArrayList<String> = arrayListOf<String>("Ashu","Ajay") stringList.printValue() val floatList: ArrayList<Float> = arrayListOf<Float>(10.5f,5.0f,25.5f) floatList.printValue() } fun <T>ArrayList<T>.printValue(){ for(element in this){ println(element) } }
输出:
Ashu Ajay 10.5 5.0 25.5
祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)