- Kotlin环境设置(命令行)
- Kotlin Hello World程序(命令行)
- Kotlin程序概念解释
- Kotlin开发环境设置(IDE)
- Kotlin第一个程序(IDE)
- Kotlin变量
- Kotlin数据类型
- Kotlin类型转换
- Kotlin运算符
- Kotlin表达式、语句和块
- Kotlin标准输入/输出
- Kotlin注释
- 控制流程
- 函数
- 数组
- 字符串
- 异常处理
- 空安全
- 集合
- 注解
- 反射
- Kotlin OOP
- 范围
- Java互操作性
- 正则表达式
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")// 编译时出错 }
为了解决上述问题,使用泛型类,这是一个用户定义的类,它接受单个类中不同类型的参数。
使用泛型类型重写上面的代码。 类型为<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
替换Person
类的T
类型。
泛型语法
class_or_interface<Type>
泛型方法的语法
<Type>methodName(parameter: classType<Type>)
Kotlin泛型示例
下面来看看一个泛型方法的示例。 在此示例中,访问集合类型的泛型方法(ArrayList
)。 分别为String
和Float
类型创建ArrayList
类arrayListOf <String>("Maxsu","zyiz")
和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>("Maxsu","zyiz") val s: String = stringList[0] println("打印 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) } }
执行上面示例代码,得到以下结果 -
打印 stringList 的字符串值: Maxsu Maxsu zyiz 10.5 5.0 25.5
Kotlin通用扩展函数示例
由于扩展函数允许向类添加方法,而不继承类或任何设计模式。
在这个例子中,将一个方法printValue()
添加到泛型类型的ArrayList
类中。对就于String
和Float
类型的方法分别为stringList.printValue()
和floatList.printValue()
。 扩展函数中的this
关键字表示当前调用实例。 当使用stringList.printValue()
调用扩展函数时,this
表示包含String
类型值的stringList
实例。 类似地,使用floatList.printValue()
调用扩展函数时,this
表示包含Float
类型值的floatList
实例。
fun main(args: Array<String>){ val stringList: ArrayList<String> = arrayListOf<String>("Maxsu","zyiz") 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) } }
执行上面示例代码,得到以下结果 -
Maxsu zyiz 10.5 5.0 25.5
上一篇:Kotlin扩展函数
下一篇:Kotlin范围
扫描二维码
程序员编程王