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

Posted 韩曙亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kotlin泛型 ② ( 可变参数 vararg 关键字与泛型结合使用 | 使用 [] 运算符获取指定可变参数对象 )相关的知识,希望对你有一定的参考价值。

文章目录





一、可变参数 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 使用vararg可变参数

java可变参数Varargs

Kotlin学习笔记——接口抽象类泛型扩展集合操作符与Java互操作性单例

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

Enum<E> 的“潜在堆污染通过 varargs 参数”...为啥?

Java Varargs 可变参数使用