美文网首页
Kevin Learn Kotlin:泛型

Kevin Learn Kotlin:泛型

作者: Kevin_小飞象 | 来源:发表于2021-12-04 09:16 被阅读0次
每日一图.jpg

Kotlin 的泛型与 Java 一样,都是一种语法糖。泛型其实就是把类型参数化,它的引入给强类型编程语言加入了更强的灵活性。

泛型接口

fun main() {
    val study = Student()
    study.doHomework("math")
    println("阅读:${study.readBook()}")
}

interface Study<T> {
    fun readBook():T
    fun doHomework(t: T)
}

class Student : Study<String> {
    override fun readBook(): String {
        return "《红楼梦》"
    }

    override fun doHomework(t: String) {
        println("doHomework:${t}")
    }

}

泛型类

fun main() {
    val green = GreenColor("绿色")
    green.printColor()
}

abstract class Color<T>(var t: T){
    abstract fun printColor()
}

class GreenColor(var color: String):Color<String>(color) {
    override fun printColor() {
        println("打印颜色:${color}")
    }

}

泛型方法

fun main() {
    fromJson("{}", String::class.java)
}

fun <T> fromJson(json: String,clazz: Class<T>) : T? {
     val instance = clazz.newInstance()
    return instance
}

泛型约束

  • 约束泛型类
fun main() {
    fromJson<JSONObject>("{}",JSONObject::class.java)
}

// 泛型类型限定-1
// 所传递的类型 T 必须满足是 JSONObject的子类 或 JSONObject 类
fun <T : JSONObject> fromJson(json: String,clazz: Class<T>) : T? {
     val instance = clazz.newInstance()
    return instance
}
  • 同时约束泛型类和接口
fun main() {
    fromJson<User>("{}",User::class.java)
}

// 泛型类型限定-2
// 所传递的类型 T 必须满足 where 语句的所有条件
// 在下面的示例代码中,类型 T 必须是 JSONObject的子类 或 JSONObject 类,也实现了 Comparable
fun <T> fromJson(json: String,clazz: Class<T>) : T? where T : JSONObject,T : Comparable<T>{
     val instance = clazz.newInstance()
    return instance
}

class User : JSONObject(),Comparable<User> {
    override fun compareTo(other: User): Int {
        return 0
    }
}

泛型中的 out 与 in

  • out 约束泛型参数的类型上限
open class Animal

open class Dog : Animal()

class Cat : Animal()

class BlackDog : Dog()

fun select() {
    val animal = Dog()

    // 传入的泛型参数可以是 Animal 及 Animal 的子类 Dog Cat BlackDog
    // 方式一 在使用处使用out 关键字声明--泛型上限
    val list:ArrayList<out Animal> = ArrayList<Dog>()

    val list2:ArrayList<Animal> = ArrayList<Dog>()
}

//方式二 在定义处使用 out 关键字声明,允许传入的泛型参数可以是 T or T 的子类--泛型上限
class ArrayList<out T> {}
  • in 约束泛型参数的类型下限
open class Animal

open class Dog : Animal()

class Cat : Animal()

class BlackDog : Dog()

fun select() {
    val animal = Dog()

    // 传入的泛型参数可以是 Animal 及 Animal 的子类 Dog Cat BlackDog
    // 方式一 在使用处使用in 关键字声明--泛型下限
    val list:ArrayList<in Dog> = ArrayList<Animal>()

    val list2:ArrayList<Dog> = ArrayList<Animal>()
}

//方式二 在定义处使用 in 关键字声明,允许传入的泛型参数可以是 T or T 的父类--泛型下限
class ArrayList<in T> {}

相关文章

  • Kevin Learn Kotlin:泛型

    Kotlin 的泛型与 Java 一样,都是一种语法糖。泛型其实就是把类型参数化,它的引入给强类型编程语言加入了更...

  • Kevin Learn Kotlin:函数

    Kotlin 的方法 变量 Kotlin 中定义一个变量,只允许在变量前声明两种关键字:val 和 var。 va...

  • Kevin Learn Kotlin:委托

    Kotlin 通过关键字 by 实现委托。 类委托 类的委托即一个类中定义的方法实际是调用另一个类的对象的方法来实...

  • 泛型

    与Java泛型相同,Kotlin同样提供了泛型支持。对于简单的泛型类、泛型函数的定义,Kotlin 与 Java ...

  • Kotlin---泛型

    Kotlin不变型泛型 Kotlin的不变型泛型和Java一样,通过声明泛型类型来使用泛型类。而该种泛型声明后,则...

  • Kotlin 泛型 VS Java 泛型

    建议先阅读我的上一篇文章 -- Java 泛型 和 Java 泛型一样,Kotlin 泛型也是 Kotlin 语言...

  • JAVA 核心笔记 || [xxx] 泛型

    泛型 JAVA 的参数化类型 称为 泛型 泛型类的设计 Learn12.java 运行

  • Kotlin for android学习六:泛型

    前言 kotlin官网和kotlin教程学习教程的笔记。 1. 声明泛型 2. 泛型约束 : 对泛型的类型上限进行...

  • Kevin Learn Kotlin:Kotlin 学习资料

    Кotlin 是一种在 Java 虚拟机上运行的现代编程语言。它具有优雅的语法,并且可以与所有现有的 Java 库...

  • Kevin Learn Kotlin:From Java to

    虽然 Kotlin 的开发很方便,但当你与他人协作时,总会碰到 Java 与 Kotlin 代码共存的代码项目。 ...

网友评论

      本文标题:Kevin Learn Kotlin:泛型

      本文链接:https://www.haomeiwen.com/subject/pkafxrtx.html