Kotlin教程:泛型及示例

2020-04-2311:35:11编程语言入门到精通Comments1,753 views字数 2637阅读模式

泛型是高级编程语言中强大的功能,允许定义使用不同类型访问的类,方法和属性等。 在编译时检查类,方法等的类型差异。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18305.html

泛型类或类声明为参数化类型。 参数化类型是具有实际类型参数的泛型类型的实例。 参数化类型使用尖括号声明<>泛型主要用于集合。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18305.html

泛型的优点

以下是使用泛型的主要优点:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18305.html

  • 类型安全:通用允许仅保留单一类型的对象。泛型不允许存储其他对象。
  • 不需要类型转换:不需要对对象进行类型转换。
  • 编译时间检查:在编译时检查泛型代码,以便在运行时避免任何问题。

下面来看看在不使用泛型的情况下的存在的一些问题。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18305.html

在此示例中,使用具有单个参数的主构造函数创建Person类。 现在,要在Person类的对象中传递不同类型的数据(比如Int类型为Person(30)String类型为Person("40"))。 Person类的主要构造函数接受Int类型Person(30),但是又想接受String类型的Person("40")。它会在类型不匹配时生成编译时错误。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18305.html

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")// 编译时出错
}
Kotlin

为了解决上述问题,使用泛型类,这是一个用户定义的类,它接受单个类中不同类型的参数。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18305.html

使用泛型类型重写上面的代码。 类型为<T>Person是一个通用类型类,它接受IntString类型的参数。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18305.html

换句话说,类型参数<T>是一个占位符,它将用实际的类型参数替换。它将在实例化泛型类型时替换。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18305.html

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")
}
Kotlin

执行上面示例代码,得到以下结果 -文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18305.html

30
40
Shell

在上面的示例中,当使用类型Int作为Person <Int>(30)Person <String>("40")创建Person类的对象时,它将分别用IntString替换Person类的T类型。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18305.html

泛型语法文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18305.html

class_or_interface<Type>
Kotlin

泛型方法的语法文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18305.html

<Type>methodName(parameter: classType<Type>)
Kotlin

Kotlin泛型示例

下面来看看一个泛型方法的示例。 在此示例中,访问集合类型的泛型方法(ArrayList)。 分别为StringFloat类型创建ArrayListarrayListOf <String>("Maxsu","Yiibai")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类型。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18305.html

fun main(args: Array<String>){
    val stringList: ArrayList<String> = arrayListOf<String>("Maxsu","Yiibai")
    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)
    }
}
Kotlin

执行上面示例代码,得到以下结果 -文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18305.html

打印 stringList 的字符串值: Maxsu
Maxsu
Yiibai
10.5
5.0
25.5
Shell

Kotlin通用扩展函数示例

由于扩展函数允许向类添加方法,而不继承类或任何设计模式。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18305.html

在这个例子中,将一个方法printValue()添加到泛型类型的ArrayList类中。对就于StringFloat类型的方法分别为stringList.printValue()floatList.printValue()。 扩展函数中的this关键字表示当前调用实例。 当使用stringList.printValue()调用扩展函数时,this表示包含String类型值的stringList实例。 类似地,使用floatList.printValue()调用扩展函数时,this表示包含Float类型值的floatList实例。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18305.html

fun main(args: Array<String>){
    val stringList: ArrayList<String> = arrayListOf<String>("Maxsu","Yiibai")
    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)
    }
}
Kotlin

执行上面示例代码,得到以下结果 -文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18305.html

Maxsu
Yiibai
10.5
5.0
25.5

//原文出自【易百教程】,商业转载请联系作者获得授权,非商业转载请保留原文链接:https://www.yiibai.com/kotlin/kotlin-generics.html#article-start文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18305.html

文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/18305.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/ymba/18305.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定