Kotlin-第2節、新手使用kotlin常碰到的問題
目錄:
1、Kotlin沒有封裝類
2、Kotlin型別空值敏感
3、Kotlin沒有靜態變數與靜態方法
1、Kotlin沒有封裝類
A.java:
public class A implements AInterface{ public static final A a = new A(); @Override public void putNumber(int num){ System.out.println("int"); } @Override public void putNumber(Integer num){ System.out.println("Integer"); } }
- 如果建立一個A.kt去實現AInterface,那麼只需實現非封裝類的那個函式就行了。
A.kt:
class A:AInterface{ override fun putNumber(num:Int){ println("int") } }
- 可通過反射去呼叫Java的封裝類。
2、Kotlin型別空值敏感
A.java
public class A { public static String format(String string){ return string.isEmpty()?null : string; } }
Test.kt
fun function(str:String){ val fmt1 = format(str) val fmt2:String = format(str)//手動宣告無符號的型別 val fmt3:String? = format(str)//可空型別 //1、str為空 println(fmt1.length)//報NullPointerException,因為String!是相容型別,會按照java的語法特性去執行 println(fmt3?.length)//輸出null,正常執行 }
- fmt1的型別是String!相容型別,該型別無法手動宣告,是編譯器認為這是一個java的型別,但是放在了kotlin程式碼中使用。
- 在接收一個java類物件的時候,如果不確定他是否可能為空,你一定要將它賦值為一個可空型別。
3、Kotlin沒有靜態變數與靜態方法
kotlin的匿名內部類是被編譯成class的時候會被建立INSTANCE靜態物件,java呼叫要INSTANCE點來呼叫。
object Test{ fun sayMessage(msg:String){ println(msg) } } //java code Test.INSTANCE.sayMessage("hello"); //kotlin code Test.sayMessage("hello")
- kotlin可以直接建立靜態方法給java呼叫嗎?可以,但要在方法上加@JvmStatic註解。
object Test{ @JvmStatic fun sayMessage(msg:String){ println(msg) } } //java code Test.sayMessage("hello"); //kotlin code Test.sayMessage("hello")