空型別,智慧型別轉換
阿新 • • 發佈:2018-11-02
//面向物件 class 妹子 (性格:String, 長相:String, 聲音:String):人(性格,長相,聲音){ init {//構造方法 方法體 println("new 了一個妹子,他性格${性格},長相${長相}") } } class 帥哥 (var 性格:String,var 長相:String,var 聲音:String){ init {//構造方法 方法體 println("new 了一個妹子,他性格${性格},長相${長相}") } } open class 人 (var 性格:String,var 長相:String,var 聲音:String){ init {//構造方法 方法體 println("${this.javaClass.simpleName}new 了一個妹子,他性格${性格},長相${長相}") } } //所有類都是 Any的子類 val my妹子 =妹子("溫柔","甜美","動人") fun main(args:Array<String>){ val 我的妹子 = 妹子("","","") val 一個帥哥 = 帥哥("","","") println(我的妹子 is 人) } public class Child extends Parent { public String getname(){ return "child"; } } public class Parent { } //空型別安全 智慧型別轉換 fun getName():String{//String 非空型別 // return null;//編譯器報錯 return "" } fun getName1():String?{//String可以為空型別 return null } fun main(args:Array<String>){ println(getName().length)//無需要判空 // if(getName() == null){//condition is always false // // } val name1 = getName1() if(name1 != null){ println(name1.length) } println(name1?.length)//如果name不為空返回長度 為空返回null if(getName1() == null) return val name2 = getName1() ?: return// ?:(如果是空執行符號後面的語句) 定義一個變數值是null返回 如果不是 直接賦值 println(name1!!.length)//!! 欺騙編譯器 確定為非空型別 } fun main(args:Array<String>){ val parent:Parent = Child() if(parent is Child){ println(parent.getname())//不需要強轉 因為已經做了型別判斷了 } val string:String?="hello" if(string is String) println(string.length)//做了型別判斷 if(string != null)//做了非空判斷 println(string.length) val parent1:Parent = Parent() val child:Child? = parent as Child //parent強轉child 轉換失敗 丟擲異常 val child1:Child? = parent as? Child //轉換失敗 直接返回空 as? }