泛型
泛型是神马
- 指定数据的具体类型,是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)
泛型的特点
上下界约束
委托
是什么
- 委托是一种设计模式, 它的理念是操作对象自己不会处理某段逻辑,而是会把工作委托给另一个辅助对象去处理。
类委托
将一个类的具体实现委托给另一个类去完成
看看委托模式实现的一个小类
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()
}
给了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中的一个属性操作类,用于获取各种属性的相关值
- setValue的三个参数解释
- 前两个和getValue函数的相似
- 第三个参数表示具体要赋值给委托属性的值——————该参数类型要和getValue()方法中返回值类型相同
参考《第一行代码》
郭霖老师
|