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

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                [TOC] ## 泛型的分類 由于泛型可以體現在類、接口以及方法中,因此可以將泛型分為3種類型,分別是泛型類、泛型接口以及泛型方法。本節我們將對這3種類型進行詳細講解。 ### 泛型類 #### 泛型類的定義 **使用泛型標記的類,被稱為泛型類**。 泛型類的使用分為兩種情況,一種是泛型類**被用于實例化**,另一種是泛型類**被用于繼承**。 當泛型類用于實例化時,需要傳遞具體的類型實參。 ##### (1)泛型類被用于實例化 ``` val list = ArrayList<String>() //String類型為泛型實參 val map = HashMap<String, Int>() //String、Int 為泛型實參 val set = HashSet<Long>() //Long 為泛型實參 ``` ##### (2)泛型類被用于繼承 當泛型類被用于繼承時,需要為泛型形參提供一個具體類型或者另一個類型的形參。具體示例代碼如下: ``` class ArrayList<E> : AbstractList<E>(), List<E>, java.io.Serializable { override val size: Int = 0 override fun get(index: Int): E { TODO("not implemented") } } ``` 上述代碼中,ArrayList<E>表示定義了一個泛型類,其中<E>表示聲明了一個泛型形參,具體的實參類型在ArrayList被使用時決定。代碼中的AbstractList<E>、List<E>兩個泛型類是在ArrayList<E>泛型類中被使用,因此需要給它們傳遞一個具體的類型。由于傳遞的具體類型暫不確定,但是可以明確AbstractList<E>、List<E>需要的類型實參和ArrayList<E>需要的類型實參一致,因此AbstractList<E>、List<E>兩個泛型類接收的類型是當前ArrayList<E>這個泛型類的類型形參。 #### 自定義泛型類 除了使用系統提供的泛型類之外,還可以自定義泛型類,Kotlin中自定義泛型類定義的格式如下所示: ``` [訪問修飾符]class 類名<泛型符號1,泛型符號2,…>{ 泛型符號1 泛型成員1; 泛型符號2 泛型成員2; } ``` 上述格式中,泛型聲明在類名之后, * 泛型的符號**一般使用大寫字母**,如<T>、<E>、<K>、<V>等,泛型符號可以是**滿足Kotlin命名規則的任意字符,甚至可以是某一個單詞**,如<TYPE> * **一個類可以聲明多個泛型,只要使用不同的泛型符號即可**,如{TODO}。 接下來我們通過一個案例來自定義一個泛型類,首先在IDEA中創建一個名為Chapter07的項目,包名指定為com.itheima.chapter07,該包用于存放后續案例中創建的文件,接著在該包中創建一個GenericsClass.kt文件,在該文件中自定義一個泛型類Box。具體代碼如下所示。 ``` class Box<T> { var t: T? = null fun add(t: T): Unit { this.t = t; } fun get(): T? { return t } } data class Apple(val name: String) //Apple數據類 fun main(args: Array<String>) { val box = Box<Apple>() box.add(Apple("紅富士蘋果")) val apple = box.get() println(apple.toString()) } ``` 運行結果: ``` Apple(name=紅富士蘋果) ``` 上述代碼中,自定義了一個泛型類Box與數據類Apple。在泛型類Box中,創建了一個類型為T的變量t,接著創建了add()方法與get()方法,分別用于設置和獲取變量t的值。在數據類Apple的主構造函數中傳遞了一個String類型的變量name,在main()函數中,創建泛型類Box的實例對象,接著調用add()方法將泛型類Apple的實例傳遞到該方法中,最后通過get()方法獲取變量t的值并打印。 ### 泛型接口 **使用泛型標記的接口,被稱為泛型接口**。 泛型接口的使用分為兩種情況, * 一種情況是泛型接口被實現時可以確定泛型接口對應的實參,直接傳遞實參即可; * 另一種情況是泛型接口被實現時不能確定泛型接口對應的實參,則需要使用當前類或者接口的泛型形參。 接下來我們針對這兩種情況進行講解。 * 情況一:泛型接口被實現時能夠確定泛型接口對應的實參,直接傳遞實參即可。具體代碼如下: ``` interface List<String> : Collection<String>{} ``` * 情況二:泛型接口被實現時不能夠確定泛型接口對應的實參,則需要使用當前類或者接口的泛型形參。具體代碼如下: ``` interface List<E> : Collection<E>{} ``` 上述代碼中,`List<E>`屬于定義了一個泛型接口。`List<E>`這里的`<E>`屬于聲明了一個泛型形參,具體是什么類型實參,由List被使用的時候決定。`List<E>`繼承自`Collection<E>`,使用`List<E>`時,無論傳遞的是什么類型參數,`Collection<E>`的類型實參和`List<E>`的類型實參都是一致的。 ### 泛型方法 #### 泛型方法的定義 **使用泛型標記的方法,被稱為泛型方法**。泛型方法在被調用時,只需傳入具體的泛型實參即可,**Kotlin語言比較智能,在一些情況下,可以不用給具體的類型實參,程序會自動推斷**。接下來我們先來看一下最簡單的泛型方法main(),具體代碼如下所示: ``` fun main(args: Array<String>) { //String類型為泛型實參,Kotlin自動推斷 val list = arrayListOf("a","b","c") //String、Int 為泛型實參,Kotlin自動推斷 val map = hashMapOf("a" to 1,"b" to 2) //Long 為泛型實參,Kotlin自動推斷 val set = hashSetOf(1L,2L,3L) } ``` 上述代碼中,定義了一個`<String>`類型的泛型方法,當創建具體的泛型實參時,IDEA編輯器會自動推斷泛型實參的類型,然后在變量名稱后通過“:+參數類型”的方式添加標識,如圖所示。 ![](https://img.kancloud.cn/24/1e/241e0acaf26eeb7f039d43c2ea184cf4_740x202.png) :-: 自動判斷泛型類型 在圖中,**用方框標識出來的部分是編譯器根據具體的泛型實參自動推斷出的泛型實參的類型**。 #### 高階函數中的泛型方法 在高階函數中,自定義了很多泛型方法,具體代碼如下所示。 ``` fun main(args: Array<String>) { val letters = ('a'..'z').toList() println(letters.slice<Char>(0..2)) //調用泛型方法,顯示地指定類型實參 println(letters.slice(10..13)) //調用泛型方法,編譯器推導出T是Char } ``` 運行結果: ``` [a, b, c] [k, l, m, n] ``` #### 自定義泛型方法 除了使用系統提供的泛型方法,還可以**自定義泛型方法**,只需要**把握自定義泛型方法的格式即可**。那么,Kotlin中自定義泛型方法的格式是怎樣的呢?下面就來看一下自定義泛型方法的格式,具體如下: ``` 修飾符fun <泛型符號> 方法名(方法參數): 方法返回值 { … } ``` 根據上述自定義泛型方法的格式,接下來我們來自定義一個泛型方法,具體代碼如下所示。 ``` fun <T> printInfo(content: T) { when (content) { is Int -> println("傳入的$content,是一個Int類型") is String -> println("傳入的$content,是一個String類型") else -> println("傳入的$content,不是Int也不是String") } } fun main(args: Array<String>) { printInfo(10) printInfo("hello world") printInfo(true) } ``` 運行結果: ``` 傳入的10,是一個Int類型 傳入的hello world,是一個String類型 傳入的ture,不是Int也不是String ```
                  <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>

                              哎呀哎呀视频在线观看