泛型和委托——kotlin

泛型

泛型是神马
  • 指定数据的具体类型,是String还是Int,还是其他类
泛型类
class MyClass<T>{
	fun method(param : T){
		return param
	}
}
  • 党委们调用上面MyClass类的是时候,可以将泛型指定成具体的类型,eg

    val myClass = MyClass<Int>()
    val result = myClass.method(123)
    
  • 这样子method的参数类型就被指定成为Int类型,泛型泛型,体现它的泛,即多变,传啥就变啥。

泛型方法
写法注意
  • 将泛型结构写在方法前面即可
class MyClass{
	fun <T>method(param: T):T{
		return param
	}
}
调用
val myClass = MyClass()
val result = myClass.method<Int>(123)

kotlin优秀的推导机制

val myClass = MyClass()
val result = myClass.method(123)	
泛型的特点
上下界约束
  • 当然有着像java泛型的上下界约束 <T: Number> 指定了该泛型类型只能是Int,Float,Double等数字类型

  • 默认上界为 Any?

委托

是什么
  • 委托是一种设计模式, 它的理念是操作对象自己不会处理某段逻辑,而是会把工作委托给另一个辅助对象去处理。
类委托
将一个类的具体实现委托给另一个类去完成

看看委托模式实现的一个小类

class MySet<T>(val helperSet: HashSet<T>):Set<T>{
	override val size:Int
		get() = helperSet.size
	override fun contains(element:T) = helperSet.contains(element)
	..............
	override fun iterator() = helperSet.iterator()
}
  • 以上借助helperSet(辅助对象)参数去实现MySet,这就是一种委托模式
问题所在:
  • ​ 如果需要实现这个接口的函数特别多,每个函数都用相应的辅助对象去实现,写到肾虚。
委托的功能
使用

关键字by ,在接口后面使用by关键字,再接上受委托的辅助对象,可以免去实现的那一大堆方法

class MySet<T>(val helperSet: HashSet<T>):Set<T> by helperSet{

}

留意以上by helperSet

这样子想实现哪一个方法就可以实现哪一个方法。

class MySet<T>(val helperSet: HashSet<T>):Set<T> by helperSet{
	fun helloWorld() = println("你好世界")
	override fun isEmpty() = false//逻辑是错误,格式正确,仅仅展示而已
}
委托属性
将一个属性(字段)的具体实现委托给另一个类去实现

eg

class MyClass{
	var p by Delegate()
}
  • 将p的属性委托给右边的Delegate类去完成。

给了Delegate,那么它是怎么让p得到值和获取值呢

+class MySet(val helperSet: HashSet):Set by helperSet{

————调用p的属性时自动调用Delegate 的getValue() ,设置p的属性的时候自动调用Delegate的setValue()

实现Delegate
class Delegate{
	var propValue: Any? = null
	operator fun getValue(myClass: MyClass,prop: KProperty<*>:Any?){
		return propValue
	}
	
	operator fun setValue(myClass:MyClass,prop:KProperty<*>,value:Any?){
	 	propValue = value
	}
}
  • getValue的两个参数解释 ,
    • 第一个参数是 用于声明该Delegate类的委托功能可以再什么类中使用 (指定什么类用这委托功能)
    • 第二个参数是 KProperty<*>是Kotlin中的一个属性操作类,用于获取各种属性的相关值
      • <*>类似java 的<?>
  • setValue的三个参数解释
    • 前两个和getValue函数的相似
    • 第三个参数表示具体要赋值给委托属性的值——————该参数类型要和getValue()方法中返回值类型相同

参考《第一行代码》

郭霖老师

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值