<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>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                到這里很多讀者可能會有疑惑,你說協變我還好理解,畢竟原來是父子,支持泛型協變后的泛型類也還是父子關系。但是反過來又是什么一個什么情況?比如Double是Number的子類型,反過來`Generic<Double>`卻是`Generic<Number>`的父類型?那么到底有沒有這種場景呢? 我們來思考一個問題,假設現在需要對一個`MutableList<Double>`進行排序,利用其sortWith方法,我們需要傳入一個比較器,所以可以這么做: ``` val doubleComparator = Comparator<Double> { d1, d2-> d1.compareTo(d2) } val doubleList = mutableListOf(2.0, 3.0) doubleList.sortWith(doubleComparator) ``` 暫時來看,沒有什么問題。但是現在我們又需要對`MutableList<Int>`、`MutableList<Long>`等進行排序,那么我們是不是又需要定義intComparator、longComparator等呢?現在看來這并不是一種好的解決方法。那么**試想一下可不可以定義一個比較器,給這些列表使用。我們知道,這些數字類有一個共同的父類Number,那么Number類型的比較器是否代替它的子類比較器**?比如: ``` val numberComparator = Comparator<Number> { n1, n2-> n1.toDouble().compareTo(n2.toDouble()) } val doubleList = mutableListOf(2.0, 3.0) doubleList.sortWith(numberComparator) val intList = mutableListOf(1,2) intList.sortWith(numberComparator) ``` 編譯通過,驗證了我們的猜想。那么為什么numberComparator可以代替doubleComparator、intComparator呢?我們來看一下**sortWith方法的定義**: ``` public fun <T> MutableList<T>.sortWith(comparator: Comparator<in T>): Unit { if (size > 1) java.util.Collections.sort(this, comparator) } ``` 這里我們又發現了一個**關鍵詞in**,跟out一樣,它也使泛型有了另一個特性,那就是**逆變**。簡單來說,**假若類型A是類型B的子類型,那么`Generic<B>`反過來是`Generic<A>`的子類型**,所以我們就可以將一個numberComparator作為doubleComparator傳入。那么將泛型參數聲明為逆變會不會有什么限制呢? 前面我們說過,**用out關鍵字聲明的泛型參數類型將不能作為方法的參數類型,但可以作為方法的返回值類型,而in剛好相反**。比如聲明以下一個列表: ``` interface WirteableList<in T> { fun get(index: Int): T //Type parameter T is declared as 'in' but occurs in 'out' position in type T fun get(index: Int): Any //允許 fun add(t: T): Int //允許 } ``` 我們**不能將泛型參數類型當作方法返回值的類型,但是作為方法的參數類型沒有任何限制**,其實從in這個關鍵詞也可以看出,in就是入的意思,可以理解為消費內容,所以我們**可以將這個列表看作一個可寫、可讀功能受限的列表,獲取的值只能為Any類型**。在Java中使用`<? super T>`可以達到相同效果。 到這里相信大家對泛型的變形,以及如何在Kotlin中使用協變與逆變有了大概的了解了。下面我們就著重來探討一下如何簡單地使用它們,并總結它們之間的差異。
                  <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>

                              哎呀哎呀视频在线观看