个性化阅读
专注于IT技术分析

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<String>){
var ageInt: Person = Person(30)
var ageString: Person = Person("30")// compile time error
}

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

让我们使用泛型类型重写上面的代码。类型为<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>)

Kotlin通用示例

让我们看一个通用方法的例子。在此示例中, 我们将访问集合类型(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

Kotlin通用扩展功能示例

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

在此示例中, 我们向通用类型的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
赞(0)
未经允许不得转载:srcmini » Kotlin泛型

评论 抢沙发

评论前必须登录!