<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                [TOC] ### 前言 **Kotlin 引以為豪的是和Java 的互操作性,而你知道Java 的類型系統是不支持可空性的。那么當你混合使用Kotlin和Java 時會發生什么?會不會失去所有的安全性?或者每個值都必須檢查是否為null ?** 有些時候Java 代碼包含了可空性的信息,這些信息使用注解來表達。當代碼中出現了這樣的信息時,Kotlin 就會使用它。因此Java中的`@Nullable String` 被Kotlin 當作String?,而`@NotNull String` 就是String,如圖所示。 根據Java 類型的注解, Java類型會在Kotlin 中表示為可空類型和非空類型 ![](https://box.kancloud.cn/f9aa0d226628c044cab51a52fb79684e_391x169.png) Kotlin可以識別多種不同風格的可空性注解,包括JSR-305 標準的注解(在javax.annotation 包之中)、Android 的注解( android.support.annotation )和JetBrains 工具支持的注解(org.jetbrains.annotations )。 如果這些注解不存在會發生什么?這種情況下, Java 類型會變成Kotlin 中的平臺類型。 ### **平臺類型** **平臺類型本質上就是Kotlin不知道可空性信息的類型。既可以把它當作可空類型處理, 也可以當作非空類型處理**(如圖所示)。這意味著,你要像在Java中一樣,對你在這個類型上做的操作負有全部責任。編譯器將會允許所有的操作,它不會把對這些值的空安全操作高亮成多余的,但它平時卻是這樣對待非空類型值上的空安全操作的。如果你認為這個值為null,在使用它之前可以用它和null比較。如果你認為它不為null,就直接使用它。就像在Java中一樣,如果你錯誤地理解了這個值,使用的時候就會遇到NullPointerException 。 **Java 類型在Kotlin 中表示為平臺類型,既可以把它當作可空類型也可以當作非空類型來處理** ![](https://box.kancloud.cn/a2623fb1961d8b4e5c6f9c6ae4a05ebd_356x130.png) **示例** Java代碼 ~~~ public class Phone { private final String name; public Phone(String name){ this.name=name; } public String getName(){ return name; } } ~~~ kotlin代碼 ~~~ fun main(args: Array<String>) { yellAt(Phone(null)) } fun yellAt(phone: Phone){ println(phone.name.toUpperCase()+"!!!") //toUpperCase()調用的接收者phone.name為null , 所以這里會拋出異常 } ~~~ 運行結果 ``` Exception in thread "main" java.lang.IllegalStateException: phone.name must not be null at A基礎.可空性和JavaKt.yellAt(可空性和Java.kt:8) at A基礎.可空性和JavaKt.main(可空性和Java.kt:4) ``` >[info]【注意】:這里你看到的不是一個干巴巴的NullPointerException ,而是一條更詳細的錯誤消息,告訴你方法toUppercase 不能在null 的接收者上調用。 事實上,對于公有的Kotlin函數,編譯器會生成對每個非空類型的參數(和接收者)的檢查,所以,使用不正確的參數的調用嘗試都會立即被報告為異常。注意,這種值檢查在函數調用的時候就執行了,而不是等到這些參數被使用的時候。這確保了不正確的調用會被盡早發現,那些由于null值被傳給代碼不同層次的多個函數之后,并被這些函數訪問時而產生難以理解的異常就能被避免。 另外一個選擇是把`getName()`的返回類型解釋為可空的并安全地訪問它。 修改如下 ~~~ fun yellAtSafe(phone: Phone){ println((phone.name?:"Anyone").toUpperCase()+"!!!") } ~~~ 運行結果 ``` ANYONE!!! Process finished with exit code 0 ``` >[info]【**注意**】使用Java API 時要特別小心。大部分的庫都沒有(可空性)注解,所以可以把所有類型都解釋為非空,但那樣會導致錯誤。為了避免錯誤,你應該閱讀要用到的Java 方法的文檔( 必要時還要查看它的實現〉, 搞清楚它們什么時候會返回null,并給那些方法加上檢查。 在Katlin 中不能聲明一個平臺類型的變量,這些類型只能來自Java 代碼,如下面的代碼就會報錯 ~~~ val i:Int=phone.name ~~~ 會報錯如下:`錯誤: 類型不匹配: 推斷類型為字符串但是給的是Int整型` `ERROR: Type mismatch : inferred type is String! but Int was expected` String ! 表示法被Kotlin 編譯器用來表示來自Java 代碼的平臺類型。你不能在自己的代碼中使用這種語法。而且感嘆號通常與問題的來源無關,所以通常可以忽略它。它只是強調類型的可空性是未知的。 **創建混合的Kotlin和Java 類層級關系時會遇到的一些陷阱** **繼承** 當在Kotlin 中重寫Java 的方法時, 可以選擇把參數和返回類型定義成可空的,也可以選擇把它們定義成非空的。例如,我們來看一個Java 中的StringProcessor 接口。 ``` interface StringProcessor { void process(String value); } ``` Kotlin中下面的兩種實現編譯器都可以接收 ~~~ class StringPrinter:StringProcesser{ override fun process(value:String){ println(value) } } class NullableStringPrinter:StringProcesser{ override fun process(value: String?){ if(value !=null){ println(value) } } } ~~~ >[info]【**注意**】,在實現Java 類或者接口的方法時一定要搞清楚它的可空性。因為方法的實現可以在非Kotlin的代碼中被調用, Kotlin 編譯器會為你聲明的每一個非空的參數生成非空斷言。如果Java 代碼傳給這個方法一個null 值,斷言將會觸發,你會得到一個異常,即便你從沒有在你的實現中訪問過這個參數的值。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看