<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 功能強大 支持多語言、二開方便! 廣告
                ## 打破泛型不變 前面我們所講的都是泛型的一些基本概念,比如為什么需要泛型,運行時泛型的狀態等。下面我們將會了解泛型的一些高級特性,比如協變、逆變等,并學習Kotlin如何將之前在Java泛型中比較難以理解的概念進行更優雅的改造,變得更容易理解。 ### 為什么`List<String>`不能賦值給`List<Object>` 我們在前面已經提出了類似的問題,`List<Apple>`無法賦值給`List<Fruit>`,并接觸了數組是協變,而List是不變的相關概念,而且用反證法說明了如果在Java支持直接聲明泛型數組會出現什么問題。現在我們用同樣的思維來看待這個問題,假如`List<String>`能賦值給`List<Object>`會出現什么情況。我們來看一個例子: ``` List<String> stringList = new ArrayList<String>(); List<Object> objList = stringList; //假設可以,編譯報錯 objList.add(Integer(1)); String str = stringList.get(0); //將會出錯 ``` 我們發現,**在Java中如果允許`List<String>`賦值給`List<Object>`這種行為的話,那么它將會和數組支持泛型一樣,不再保證類型安全,而Java設計師明確泛型最基本的條件就是保證類型安全,所以不支持這種行為**。但是到了Kotlin這里我們發現了一個奇怪的現象: ``` val stringList: List<String> = ArrayList<String>() val anyList: List<Any> = stringList //編譯成功 ``` 在Kotlin中竟然能將`List<String>`賦值給`List<Any>`,不是說好的Kotlin和Java的泛型原理是一樣的嗎?怎么到了Kotlin中就變了?其實我們前面說的都沒錯,關鍵在于這兩個List并不是同一種類型。我們分別來看一下兩種List的定義: ``` public interface List<E> extends Collection<E> { ... } public interface List<out E> : Collection<E> { ... } ``` 雖然都叫List,也同樣支持泛型,但是Kotlin的List定義的泛型參數前面多了一個out關鍵詞,這個關鍵詞就對這個List的特性起到了很大的作用。普通方式定義的泛型是不變的,簡單來說就是不管類型A和類型B是什么關系,`Generic<A>`與`Generic<B>`(其中Generic代表泛型類)都沒有任何關系。比如,在Java中String是Oject的子類型,但`List<String>`并不是`List<Object>`的子類型,在Kotlin中泛型的原理也是一樣的。但是,Kotlin的List為什么允許`List<String>`賦值給`List<Any>`呢?
                  <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>

                              哎呀哎呀视频在线观看