文章目录
- 一、可变参数 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 !