📅  最后修改于: 2021-01-05 08:05:59             🧑  作者: Mango
泛型是强大的功能,可以定义类,方法和属性等,可以使用不同的类型进行访问。在编译时检查类,方法等的类型差异。
泛型类型类或方法被声明为参数化类型。参数化类型是具有实际类型参数的泛型类型的实例。使用尖括号<>声明参数化类型。泛型通常在集合中使用。
以下是使用泛型的主要优点:
让我们看看不使用泛型的问题。
在此示例中,我们创建了一个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){
var ageInt: Person = Person(30)
var ageString: Person = Person("30")// compile time error
}
为了解决上述问题,我们使用通用类型类,它是用户定义的类,它在单个类中接受不同类型的参数。
让我们使用泛型类型重写上面的代码。类型为
换句话说,类型参数
class Person(age: T){
var age: T = age
init {
this.age= age
println(age)
}
}
fun main(args: Array){
var ageInt: Person = Person(30)
var ageString: Person = Person("40")
}
输出:
30
40
在上面的示例中,当使用Int类型作为Person
通用类的语法
class_or_interface
通用方法的语法
methodName(parameter: classType)
让我们看一个通用方法的例子。在此示例中,我们将访问集合类型(ArrayList)的通用方法。为此,我们分别创建了StringList和Float类型的ArrayList类arrayListOf
fun main(args: Array){
val stringList: ArrayList = arrayListOf("Ashu","Ajay")
val s: String = stringList[0]
println("printing the string value of stringList: $s")
printValue(stringList)
val floatList: ArrayList = arrayListOf(10.5f,5.0f,25.5f)
printValue(floatList)
}
fun printValue(list: ArrayList){
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){
val stringList: ArrayList = arrayListOf("Ashu","Ajay")
stringList.printValue()
val floatList: ArrayList = arrayListOf(10.5f,5.0f,25.5f)
floatList.printValue()
}
fun ArrayList.printValue(){
for(element in this){
println(element)
}
}
输出:
Ashu
Ajay
10.5
5.0
25.5