kotlin泛型②(可变参数vararg关键字与泛型结合使用|使用[]运算符获取指定可变参数对象)(代码片段)

韩曙亮 韩曙亮     2023-01-24     755

关键词:

文章目录





一、可变参数 vararg 关键字与泛型结合使用



如果 泛型类型 T 的参数 是 vararg 可变参数 , 则在接收 可变参数 时 , 需要使用 Array<out T> 类型 的变量进行接收 ;

参数为 vararg 可变参数 , 那么可以传入多个 指定类型的 实例对象 ;


在下面的代码中 , 声明了 泛型参数 T , T 类型不必须是 Weapon 类的子类类型 ;

在 Soldier 的主构造函数中 , 传入了 泛型 T 类型的 可变参数 对象 ;

如果要使用 成员属性 接收该 泛型 T 类型的 可变参数 对象 , 则必须 使用 Array<out T> 类型对象进行接收 ;


代码示例 :

class Soldier<T : Weapon>(vararg _items: T) 
    var items: Array<out T> = _items

    fun fight()
        for (item in items) 
            item.fire()
        
    


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

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

class T72: Weapon("T72")
    override fun fire()
        super.fire()
        println("T72 fire fire !")
    


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

执行结果 :

weapon fire!
AK47 fire fire !
weapon fire!
T72 fire fire !




二、使用 [] 运算符获取指定可变参数对象



如果想要 使用 [] 运算符获取指定可变参数对象 , 就需要 重写 该类 的 get 函数 进行 运算符重载 ;


如果想要通过 Soldier 实例对象[] 运算符获取其 items: Array<out T> 中的某个元素 , 则需要重写该类的 get 方法 ;

    var items: Array<out T> = _items

    operator fun get(index: Int): T? 
        return items[index]
    

之后使用 soldier[0] 即可获取 items 可变参数中的实例对象 ;

    var soldier: Soldier<Weapon> = Soldier(AK47(), T72())
    soldier[0]?.fire()
    soldier[1]?.fire()

代码示例 :

class Soldier<T : Weapon>(vararg _items: T) 
    var items: Array<out T> = _items

    operator fun get(index: Int): T? 
        return items[index]
    

    fun fight()
        for (item in items) 
            item.fire()
        
    


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

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

class T72: Weapon("T72")
    override fun fire()
        super.fire()
        println("T72 fire fire !")
    


fun main() 
    var soldier: Soldier<Weapon> = Soldier(AK47(), T72())
    soldier[0]?.fire()
    soldier[1]?.fire()

执行结果 :

weapon fire!
AK47 fire fire !
weapon fire!
T72 fire fire !

kotlin使用vararg可变参数(代码片段)

文章目录背景Kotlin中使用可变参数对Kotlin可变参数反编译资料背景一般在项目开发中,我们经常会在关键节点上埋点,而且埋点中会增加一些额外参数,这些参数通常是成对出现且参数个数是不固定的。如下://... 查看详情

java可变参数varargs

...。本文介绍这一机制的使用方法,以及这一机制与数组、泛型、重载之间的相互作用时的若干问题。 到J2SE1.4为止,一直无法在Java程序里定义实参个数可变的方法—&mdas 查看详情

kotlin函数(代码片段)

...它们是成员函数或扩展函数-它们只有一个参数它们用infix关键字标记//DefineextensiontoIntinfixfunInt.shl(x:Int):Int...//callextensionfunctionusinginfixnotation1shl2//isthesameas1.shl(2)可变参数我们可以通过vararg修饰符来表明一个参数是可变参数来允许... 查看详情

kotlin泛型vsjava泛型

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

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

...类型约束泛型vararg参数vararg示例泛型vararg类型判断out和in关键字扩展扩展函数扩展属性对泛型扩展infix:中缀表达式结合泛型使用集合操作符mapflatMapfilterzip与Java的互操 查看详情

模板与泛型编程

...式,可以用来生成针对特定类型的函数版本。模板定义以关键字template开始,后跟一个模板参数列表。模板参数列表时一个以逗号分割的一个后多个模板参数的列表(不能为空)。用小于号和大于号包围起来。例如:template<type... 查看详情

kotlin扩展函数②(扩展属性|为可空类型定义扩展函数|使用infix关键字修饰单个参数扩展函数的简略写法)(代码片段)

文章目录一、扩展属性二、可空类扩展三、使用infix关键字修饰单个参数扩展函数的简略写法一、扩展属性上一篇博客【Kotlin】扩展函数(扩展函数简介|为Any超类定义扩展函数|private私有扩展函数|泛型扩展函数|标准函数let函数是... 查看详情

kotlin|浅谈reified与泛型那些事(代码片段)

...实现机制,所以某些情况下就会显得力不从心。而在Kotlin中,由于最终也会被编译为java字节码,所以无可避免也存在着上述问题🙂。什么是类型擦除?如 查看详情

集合框架与泛型

集合框架:★★★★★,用于存储数据的容器。特点:1:对象封装数据,对象多了也需要存储。集合用于存储对象。2:对象的个数确定可以使用数组,但是不确定怎么办?可以用集合。因为集合是可变长度的。 集合和数组... 查看详情

重载与泛型参数

】重载与泛型参数【英文标题】:Overloadsvsgenericarguments【发布时间】:2010-11-2208:04:09【问题描述】:我有一个问题。在框架中,这主要是在泛型出现之前编写的,你经常看到一个函数有很多重载来做不同类型的事情。a)Parse(intdata... 查看详情

Kotlin Native iOS 字符串格式化与可变参数

】KotlinNativeiOS字符串格式化与可变参数【英文标题】:KotlinNativeiOSstringformattingwithvararg【发布时间】:2021-02-0605:37:16【问题描述】:基于thisissue关于使用NSString格式化我尝试在使用vararg时实现格式化的多平台实现,到目前为止没... 查看详情

kotlin泛型③(泛型out协变|泛型in逆变|泛型invariant不变|泛型逆变协变代码示例|使用reified关键字检查泛型参数类型)(代码片段)

...型invariant不变四、泛型逆变协变代码示例五、使用reified关键字检查泛型参数类型本章总结:使用了泛型out协变和泛型in逆变极大的提高了程序的扩展性;泛型in逆变:使用in关键字,可以使父类泛型对象赋值给子类泛型对象;泛型out协变... 查看详情

关于可变参数varargs(代码片段)

  今天在看源码的时候,面对以下有点蒙蔽,在这里对可变参数做一下总结。  主要理解取自一个博客,c版本的:https://www.cnblogs.com/bettercoder/p/3488299.html示例输出如下:  更多详细解释请看: http://www.cplusplus.com/referenc... 查看详情

模板与泛型编程——定义模板(代码片段)

一、定义模板1、函数模板  模板定义以关键字template开始,后跟一个模板参数列表,这是一个逗号分隔的一个或多个模板参数的列表,用<>括起来。在模板定义中,模板参数列表不能为空。模板参数表示在类或函数定义中... 查看详情

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

...可以让函数接受任何类型的参数。1.2要使用泛型,就要在关键字fun后面加上泛型占位符,在参数中使用这个占位符。举个栗子:1.3举个栗子2: 查看详情

认识collection与泛型

主要内容 Collection集合 迭代器 增强for 泛型 Collection集合 集合到底是什么呢?集合:集合是java中提供的一种容器,可以用来存储多个数据。集合和数组既然都是容器,它们有啥区别呢?数组的长度是固定的... 查看详情

为啥将 Collections.emptySet() 与泛型一起使用在赋值中而不是作为方法参数?

】为啥将Collections.emptySet()与泛型一起使用在赋值中而不是作为方法参数?【英文标题】:WhydoesusingCollections.emptySet()withgenericsworkinassignmentbutnotasamethodparameter?为什么将Collections.emptySet()与泛型一起使用在赋值中而不是作为方法参数... 查看详情

dart学习笔记-枚举与泛型(代码片段)

一、枚举1、枚举是一种有穷序列集的数据类型2、使用关键字enmu定义一个枚举3、常用于代替常量,控制语句等enumSeasonspring,summer,autumn,wintervoidmain()varcurrentSeason=Season.spring;switch(currentSeason)caseSeason.spring:print("1-3月" 查看详情