扩展
Kotlin 可以对一个类的属性和方法进行扩展,且不需要继承或使用 Decorator 模式。
扩展是一种静态行为,对被扩展的类代码本身不会造成任何影响。
- 扩展函数的声明非常简单,它的关键字是 < Type >,此外我们需要一个接收者类型,通常是类或接口的名称来作为它的前缀
- 如下扩展Person类
fun main(args: Array<String>) {
var person = Person("张三")
person.print()
}
class Person ( var name:String)
fun Person.print(){
println("用户名 $name")
}
标准库中的扩展函数:apply,with,run,let,also,takeIf
- apply:返回的是原来的对象
fun main(args: Array<String>) {
val stu = Student("张三",15)
stu.apply {
val name = name
val age = age
}
}
data class Student(var name:String,var age:Int)
- with
在Android开发中,我们经常会给一些视图绑定属性。利用with可以让代码的可读性更好
fun main(args: Array<String>) {
val stu = Student("张三",15)
with(stu){
txtName.text = name
txtAge.txt = age
}
}
data class Student(var name:String,var age:Int)
- run
这个范围函数本身不是很有用,但是相比范围,还有一点挺不错的是它返回范围内最后一个对象。
fun main(args: Array<String>) {
testFun()
}
fun testFun(){
val nickname = "张三"
run {
val nickname = "李四"
println(nickname)
}
println(nickname)
}
输出:
李四
张三
应用场景
:用户点击新人奖励的按钮,如果该用户此时没有登录则弹出loginDialog,如果用户已经登录则弹出领取奖励的getAccountDialog。我们可以使用一下代码来处理这个逻辑
run {
if (!isLogin) loginDialog else getAccountDialog
}.show()
- let:返回的是闭包里面的值
fun main(args: Array<String>) {
val stu = Student("张三",15)
stu.let {
val name = it.name
val age = it.age
}
}
data class Student(var name:String,var age:Int)
-
also:它像是let和apply函数的加强版,与apply一致,它的返回值是该函数的接收者
-
takeIf:如果我们不仅仅只想判空,还想加入条件,这时let可能显得有点不足
fun main(args: Array<String>) {
val stu = Student("张三", 15)
stu.takeIf { it.age > 15 }.let {
it?.name
}
}
data class Student(var name: String, var age: Int)
泛型
fun main(args: Array<String>) {
val box :Box<Int> = Box<Int>(10)
//或者
val b = Box(10)
}
//声明一个泛型类
class Box<T> (t:T) {
var value = t
}
泛型约束
我们可以使用泛型约束来设定一个给定参数允许使用的类型。
Kotlin 中使用 : 对泛型的类型上限进行约束。
fun main(args: Array<String>) {
sort(listOf("1","2","3"))
sort(listOf(HashMap<Int, String>())) // 错误:HashMap<Int, String> 不是 Comparable<HashMap<Int, String>> 的子类型
}
fun <T : Comparable<T>> sort (list:List<T>) {
...
}