泛型类:
class MyClass
fun method(param: T) : T {
return param
}
}
泛型方法:
class MyClass {
fun
return param
}
}
kotlin 允许对泛型的类型进行限制:指定上界的方式来对类型进行约束class MyClass {
fun
return param
}
}
实例:apply fun
block()
return this
}
2.委托基本理念:操作对象自己不会去处理某段逻辑,而是把工作委托给另一辅助对象去处理
类委托:by一个类的具体实现委托给另一个类去处理(大部分方法调用辅助对象的方法,少部分实现
由自己来重写),Java中辅助对象方法必须每个重写,而kotlin提供了委托(by)
java: 辅助对象方法必须每个重写 class MySet
override val size : Int get () = helperSet.size
override fun contains(element : T)= helperSet.contais(element)
......
overide fun iterator() = helperSet.interator()
}
kotlin:只写 对某个方法的重新实现 class MySet
fun helloWorld() = println("Hellp World")
override fun isEmpty() = false
}
委托属性:
将一个属性(字段)委托给另一个类去完成
class MyClass{
var p by 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
}
}
3.实现一个lazy函数 val p by lazy {} (代码块中的代码只会执行一次)lazy实现原理:by 关键字,lazy高阶函数(lazy - Delegate - getValue - Lambda)
仿写:懒加载技术是不会对属性进行赋值的(Lambda,最后一行作为返回)
class Later
var value : Any? = null
operator fun getValue (any: Any?,prop:KProperty<*>): T{
if (value == null){
value = block()
}
return value as T
}
}
注意:later定义为顶层函数(不定义在任何类中的函数才是顶层函数)
fun
使用:
val uriMatcher by later{
val mathcher = UriMatcher (UriMatcher.NO_MATCH)
matcher.addURI(authority,"book",bookDir)
matcher.addURI(authority,"book/#",bookItem)
matcher.addURI(authority,"category",categoryDir)
matcher.addURI(authority,"category/#",categoryItem)
matcher
}
二:infix 函数 infix : 允许将我们调用函数时的小数点,括号等计算机相关的语法去掉 (A to B) 前提条件: 1.infix 不能定义成顶层函数,必须是某个类的成员函数 2.infix 函数必须接收且只能接收一个参数定义:
infix fun String.beginWith(prefix: String) = startWith(prefix)
调用:
if ("hello world" beginWith "hello"){
}
举例:
定义:
infix fun
使用:
val list = listOf{"Apple","Banana","Orange"}
if ( list has "Banana"){
}
三:泛型的高级特性 1.实化 (T :: class.java)前提:
1.inline 关键字
2.reified 关键字
inline fun
}
inline fun
定义:
inline fun
val intent = Intent(context, T :: class.java)
intent.block()
context.startActivity(intent)
}
使用:
startActivity
putExtra("param1","data")
putExtra("param2",123)
}
3.协变 4.逆变


