kotlin泛型①(泛型类|泛型参数|泛型函数|多泛型参数|泛型类型约束)(代码片段)

韩曙亮 韩曙亮     2023-01-24     257

关键词:

文章目录





一、泛型类



定义一个 泛型类 ,

泛型参数 T 放在 尖括号 <T> 中 , 该泛型参数放在 类名后 , 主构造函数之前 , 该泛型参数 T类型占位符 ,

在 该泛型类类中 可以使用 类型占位符 T 作为一个类 使用 ,

  • 可以 定义 T 类型成员属性
  • 主构造函数中可以接收 T 类型的实例对象作为参数 ,
  • T 类型可以 作为函数的返回值 ;

通常情况下 , 泛型参数 都使用 T 表示 , 使用其它字母 或者 字符串 都可以表示 泛型参数 , 但是 约定俗成 都使用 T 来表示泛型 ;


代码示例 : 下面的代码中 , 声明了 Student 泛型类 , 该泛型类 接收 T 类型的泛型参数 , 在主构造函数中接收 T 类型的参数 , 在该泛型类中声明了 T 类型的成员属性 ;

class Student<T>(_item: T) 
    var item: T = _item
    fun log()
        println("item : $item")
    


fun main() 
    var student: Student<String> = Student("Tom")
    student.log()

    var student2: Student<Int> = Student(18)
    student2.log()

执行结果 :

item : Tom
item : 18




二、泛型参数



通常情况下 , 泛型参数 都使用 T 表示 , 使用其它字母 或者 字符串 都可以表示 泛型参数 , 但是 约定俗成 都使用 T 来表示泛型 ;

在下面的代码中 , 使用 M 作为 泛型参数 ;


代码示例 :

class Student<M>(_item: M) 
    var item: M = _item
    fun log()
        println("item : $item")
    


fun main() 
    var student: Student<String> = Student("Tom")
    student.log()

    var student2: Student<Int> = Student(18)
    student2.log()

执行结果 :

item : Tom
item : 18




三、泛型函数



函数 的 参数 或 返回值 类型为 泛型类型 , 则该函数称为 泛型函数 ;


代码示例 : 该代码中 , 泛型函数 logT 参数 和 返回值 都是 T 泛型参数 类型 ;

class Student<T>(_item: T) 
    var item: T = _item

    // 泛型函数 参数 和 返回值 都是 T 类型
    fun logT(t: T): T
        println("item : $item")
        return item
    


fun main() 
    var student: Student<String> = Student("Tom")
    println(student.logT(student.item))

    var student2: Student<Int> = Student(18)
    println(student2.logT(student2.item))

执行结果 :

item : Tom
Tom
item : 18
18




四、多泛型参数



泛型函数 中 如果涉及到 匿名函数 参数 , 匿名函数 的 参数返回值 都是泛型 的话 , 在该泛型函数 中可能需要使用多个泛型 , 使用不同的字母表示不同的泛型 ;

如果函数中 引入了新的泛型类型 , 需要在 fun 关键字函数名 之间 , 使用 尖括号 <T> 注明 ;


代码示例 :
在本代码中 , logT 函数涉及到了两个泛型参数 , 传入的 匿名函数 参数类型为 (T) -> R , 需要两个泛型参数来表示其类型 ;
T 类型在泛型类中注明 , 可以在该泛型类 Student 中随意使用 ,
但是 泛型参数 R 是首次在该函数中使用 , 因此需要在该函数的 fun 关键字函数名 之间 , 使用 尖括号 <R> 注明 新的泛型参数 ;

class Student<T>(_item: T) 
    var item: T = _item

    fun <R> logT(action: (T) -> R): R
        return action(item)
    


fun main() 
    var student: Student<String> = Student("Tom")
    println(student.logT 3.14)

    var student2: Student<Int> = Student(18)
    println(student2.logT true)

执行结果 :

  • student 实例对象中 , 泛型 T 的实际类型是 String 类型 , 在 logT 中 泛型 R 的类型是 Double 类型 ;
  • student2 实例对象中 , 泛型 T 的实际类型是 Int 类型 , 在 logT 中 泛型 R 的类型是 Boolean 类型 ;
3.14
true




五、泛型类型约束



在 泛型类 , 泛型函数 中 , 使用泛型前 , 需要声明 泛型参数 :

  • 泛型类 泛型参数 声明 : 如果类中 引入了新的泛型类型 , 需要在 class 关键字主构造函数 之前 , 使用 尖括号 <T> 注明 ;
class Student<T>(_item: T) 

  • 泛型函数 泛型参数 声明 : 如果函数中 引入了新的泛型类型 , 需要在 fun 关键字函数名 之前 , 使用 尖括号 <T> 注明 ;
    fun <R> logT(action: (T) -> R): R
        return action(item)
    

在 尖括号 <> 中声明 泛型参数 时 , 可以指定 泛型类型 的 约束 , 如 泛型类型 必须是某个类型的子类 ;


在下面的代码中 , Soldier 类的泛型 进行了约束 , 必须是 Weapon 类的子类类型 ;

class Soldier<T : Weapon>(_item: T) 

Weapon 类是父类 , 其有一个 子类 AK47 类 ;

在创建 Soldier 实例对象时 , 传入 子类 AK47 类的实例对象 , 调用其重写父类的 fire 函数 ;


代码示例 :

class Soldier<T : Weapon>(_item: T) 
    var item: T = _item

    fun fight()
        item.fire()
    


open class Weapon(var name: String)
    open fun fire()
        println("weapon fire!")
    

class AK47: Weapon("AK47")
    override fun fire()
        super.fire()
        println("fire in the hole !")
    


fun main() 
    var soldier: Soldier<AK47> = Soldier(AK47())
    soldier.fight()

执行结果 :

weapon fire!
fire in the hole !

java泛型_泛型类接口通配符方法上下边界(代码片段)

文章目录①.泛型的概述②.泛型-类class③.泛型-接口④.泛型-通配符?⑤.泛型-方法⑥.泛型上下边界①.泛型的概述①.泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类... 查看详情

ts泛型类、泛型接口、泛型函数

参考技术A泛型是一种参数化数据类型,具有以下特点1:定义时不明确,使用时必须明确成某种具体数据类型的数据类型【泛型的宽泛】2:编译期间进行数据类型安全检查的数据类型【泛型的严谨】泛型类的格式:class类名<泛... 查看详情

kotlin泛型

...类型参数化,可以用在类,接口,方法上。与Java一样,Kotlin也提供泛型,为类型安全提供保证,消除类型强转的烦恼。声明一个泛型类:classBox<T>(t:T)varvalue=t创建类的实例时我们需要指定类型参数:valbox:Box<Int>=Box<Int>(... 查看详情

kotlin初学者泛型简单剖析与使用(代码片段)

...#xff1a;CSDN博客专家、华为云·云享专家认证系列专栏:Kotlin初学者学习交流:三人行必有我师焉;择其善者而从之,其不善者而改之。目录一、泛型使用1.1泛型的优点1.2泛型类1.3泛型函数1.4泛型接口二、泛型类型约... 查看详情

kotlin初学者泛型简单剖析与使用(代码片段)

...介:CSDN博客专家、华为云享专家认证系列专栏:Kotlin初学者学习交流:三人行必有我师焉;择其善者而从之,其不善者而改之。目录一、泛型使用1.1泛型的优点1.2泛型类1.3泛型函数1.4泛型接口二、泛型类型约... 查看详情

java泛型

1.可以利用Object类实现泛型,但这种方法必须进行强制类型转换,容易出错。2.泛型类就是把数据类型参数化。3.泛型类的参数可以是泛型类。4.泛型类可以同时设置多个类型参数。5.泛型类可以继承泛型类。6.泛型类可以实现泛型... 查看详情

kotlin学习笔记——接口抽象类泛型扩展集合操作符与java互操作性单例(代码片段)

注:编码工具为IntelliJ目录接口示例定义变量示例变量默认值抽象类示例实现接口泛型泛型类泛型函数泛型实现自定义map变换泛型类联合泛型函数实现泛型函数实现类型约束泛型vararg参数vararg示例泛型vararg类型判断out和in关键... 查看详情

180530-反射获取泛型类的实际参数(代码片段)

...:https://liuyueyi.github.io/hexblog/2018/05/30/180530-通过反射获取泛型类的实际参数/反射获取泛型类的实际参数泛型用得还是比较多的,那么如何获取泛型类上实际的参数类型呢?比如一个接口为publicinterfaceIBolt<T,K>现在给一个IBolt的... 查看详情

java示例代码_泛型类,如何为可能的参数类型定义构造函数

java示例代码_泛型类,如何为可能的参数类型定义构造函数 查看详情

kotlin泛型vsjava泛型

和Java泛型一样,Kotlin泛型也是Kotlin语言中较难理解的一个部分。Kotlin泛型的本质也是参数化类型,并且提供了编译时强类型检查,实际上也是伪泛型,和Java泛型类型一样。这篇文章将介绍Kotlin泛型里中的重要概... 查看详情

java泛型知识总结篇(代码片段)

泛型与内部类非静态内部类会自动继承外围类泛型参数,对于非静态内部类,无需再次声明泛型参数静态内部类不会自动继承外围类泛型参数(事实上,Node中的泛型参数与MyLinkedList中的没有任何联系,只是这里使用相同的符号T而... 查看详情

在泛型类中传递泛型参数

】在泛型类中传递泛型参数【英文标题】:Passinggenericparametersinagenericclass【发布时间】:2019-05-2117:00:26【问题描述】:是否有可能在swift中使用泛型得到类似下面的东西?任何帮助都将比其他任何事情都更重要。classABCvartitle:Strin... 查看详情

泛型类的基本使用

泛型好处:增加类型好处,带来编码的方便常见的泛型:泛型类和泛型方法,泛型委托(自定义委托,常见的泛型委托(Func,Action))泛型类的规范:publicclass类名<T>类的成员T:仅仅是一个占位符,只要符合c#命名规范即可,但一... 查看详情

每天学一点kotlin--函数:泛型函数

参考技术A----《第一季Kotlin崛起:次世代Android开发》学习笔记总目录:每天学一点Kotlin----目录上一篇:每天学一点Kotlin--函数:标准库函数下一篇:每天学一点Kotlin--函数:类型层级1.1泛型是指“通用的类型”,在面向对象中会... 查看详情

在 kotlin 中创建泛型类的新实例的正确方法是啥?

】在kotlin中创建泛型类的新实例的正确方法是啥?【英文标题】:Whatistheproperwaytocreatenewinstanceofgenericclassinkotlin?在kotlin中创建泛型类的新实例的正确方法是什么?【发布时间】:2014-11-1810:29:55【问题描述】:我使用以下初始化:... 查看详情

java泛型泛型简介(泛型类|泛型方法|静态方法的泛型|泛型类与泛型方法完整示例)(代码片段)

文章目录一、泛型简介二、泛型类三、泛型方法四、静态方法的泛型五、泛型类与泛型方法完整示例一、泛型简介泛型可以简单理解为参数化类型,主要作用在类,方法,接口上;java泛型与C++模板:Java中的泛型,是仿照C++中... 查看详情

spark基础-scala学习(七类型参数)(代码片段)

类型参数是什么类似于java泛型,泛型类泛型函数上边界Bounds下边界ViewBoundsContextBoundsManifestContextBounds协变和逆变ExistentialType泛型类scala>:paste//Enteringpastemode(ctrl-Dtofinish)classStudent[T](vallocalId:T)defgetSchoolId(hukouId:T)="S-"+hukouId+"-"+localId... 查看详情

java高级--java泛型

类型的参数化泛型类可以同时设置多个参数泛型类可以继承泛型类泛型类可以实现泛型接口示例--泛型类packagecom.date;publicclassGenericDemo{publicstaticvoidmain(String[]args){ GenClass<String>genClass=newGenClass<String>("tanlei"); System.out 查看详情