类型检查和自动转换
- 类型检查和转换
- is !is表达式
- 智能转换
- **“不安全”的转换符和“安全”转换符 **
类型检查和转换
is !is表达式
我们可以运行是通过上面两个操作符检查一个对象是都是某个特定类型
//判断当前数据是否是某种类型
fun judgeTypeTest(){
val num=2
if (num is Int){
println(num)
}
}
输出
2
智能转换
很多情形需要使用费明确的类型,编译器会跟踪is
检查静态变量,并在需要的时候自动插入安全转换:
fun isString(str:Any){
if (str is String){
println("is String")
}
}
编译器足够智能如何转换是安全的,如果不安全,将不会返回
或者再||
&&
操作符连用
if (x is String && x.length > 0)
print(x.length) // x is automatically cast to String
when和while中使用
fun name(x:Any){
when (x) {
is Int -> print(x + 1)
is String-> println("shu chu $x")
is Array<*> -> println("这是数组长度为${x.size}")
}
}
??? when之前我认为智能在封闭函数seal中不需要带else,现在使用any为何也可以不带????
var isTrue=true
while ((x is Int)&&isTrue){
println("$x mo ren Int")
isTrue=false
}
“不安全的”转换符和“安全”转换符
如果转换是不被允许的那么转换符就会抛出一个异常因此我们称之为不安全的。在kotlin中我们用前缀as操作符标识
val x: String = y as String
注意null
不能别转换为String
因此他不是nullable
,也就是说y
是空的,则上面的代码会抛出空异常
val x:String?=y as String?
”安全转换符“
为了避免派出异常,可以用as?这个安全转换符,这样失败就会返回null。
val x:String?=y as? String
This表达式
- This表达式
- this使用范围
This表达式
在类成员中,this标识当前类的对象
在扩展函数或扩展字面函数中,this标识,左边接受者参数
如果this没有应用者,则指向的是最内层的必和范围。为了再其他范围中返回this,需要使用标签
this的使用范围
为了在范围外部(一个类或者表达式函数或者带标签的扩展字面函数)访问this,我们需要在使用this@lable
作为lable
//this的使用
class thisA {
inner class thisB {
fun Int.foo() {
val a = this@thisA
val b = this@thisB
val c = this
val d = this@foo
println(a.toString())
println(b.toString())
println(c.toString())
println(d.toString())
// val funLit=@lambda{
// String.()->
// val e=this
// val f=this@
// }
// val funLit2={(s:String)->
// val g=this
// }
}
fun testThis(){
val num1 = 5
num1.foo()
}
}
}
中间使用this@lambda
不成功不知道原因?????