📜  Kotlin泛型

📅  最后修改于: 2021-01-05 08:05:59             🧑  作者: Mango

Kotlin泛型

泛型是强大的功能,可以定义类,方法和属性等,可以使用不同的类型进行访问。在编译时检查类,方法等的类型差异。

泛型类型类或方法被声明为参数化类型。参数化类型是具有实际类型参数的泛型类型的实例。使用尖括号<>声明参数化类型。泛型通常在集合中使用。

泛型的优势

以下是使用泛型的主要优点:

  • 类型安全:泛型只允许保存一种类型的对象。泛型不允许存储其他对象。
  • 不需要强制类型转换:无需强制转换对象。
  • 编译时检查:泛型代码在编译时检查,这样可以避免在运行时出现任何问题。

让我们看看不使用泛型的问题。

在此示例中,我们创建了一个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
}

为了解决上述问题,我们使用通用类型类,它是用户定义的类,它在单个类中接受不同类型的参数。

让我们使用泛型类型重写上面的代码。类型为的Person类是通用类型的类,它接受参数的Int和String类型。

换句话说,类型参数是一个占位符,将由类型实参替换。当实例化泛型类型时,它将被替换。

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 (30)和Person (“ 40”)创建Person类的对象时,它将分别用Int和String替换类型T的Person类。

通用类的语法

class_or_interface

通用方法的语法

methodName(parameter: classType)

Kotlin通用示例

让我们看一个通用方法的例子。在此示例中,我们将访问集合类型(ArrayList)的通用方法。为此,我们分别创建了StringList和Float类型的ArrayList类arrayListOf (“ Ashu”,“ Ajay”)和arrayListOf (10.5f,5.0f,25.5f)两个不同的对象。当我们调用通用方法 PRINTVALUE(列表:ArrayList的)使用PRINTVALUE(StringList的),方法 PRINTVALUE的类型T(列表:ArrayList的)将由字符串类型代替。同样,当我们使用调用PRINTVALUE(floatList)方法的类型T的一般方法, PRINTVALUE(列表:ArrayList的)将漂浮型替换。

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

Kotlin通用扩展函数示例

由于扩展函数允许在不继承类或任何设计模式的情况下向类添加方法。

在此示例中,我们向通用类型的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