<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智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                通常情況下使用泛型我們并不在意它的類型是否是類型擦除,但是**在有些場景,我們卻需要知道運行時泛型參數的類型,比如序列化/反序列化的時候。這時候我們應該怎么辦**?通過前面的學習相信你對Java和Kotlin的泛型實現原理已經有了一定的了解,*既然編譯后會擦除泛型參數類型,那么我們是不是可以**主動指定參數類型來達到運行時獲取泛型參數類型的效果呢***?我們試著對上面的例子的Plate進行一下改造: open class Plate<T>(val t : T, val clazz: Class<T>) { fun getType() { println(clazz) } } val applePlate = Plate(Apple(1.0), Apple::class.java) applePlate.getType() //結果 class Apple 使用這種方式確實可以達到運行時獲取泛型類型參數的效果。但是**這種方式也有限制,比如我們就無法獲取一個泛型的類型**,比如: val listType = ArrayList<String>::class.java //不被允許 val mapType = Map<String, String>::class.java //不被允許 那么,還有沒有另外的方式能獲取各種類型的信息呢?有,那就是**利用匿名內部類**。我們來看下面的一個例子: val list1 = ArrayList<String>() val list2 = object : ArrayList<String>(){} //匿名內部類 println(list1.javaClass.genericSuperclass) println(list2.javaClass.genericSuperclass) //結果: java.util.AbstractList<E> java.util.ArrayList<java.lang.String> 不可思議,第2種方式竟然能在運行時知道這個list是一個什么樣的類型。心細的讀者應該發現,list2聲明的其實是一個匿名內部類。關于如何在Kotlin中用object來聲明一個匿名內部類的相關知識可以回顧一下前面相應內容。那么,**為什么使用匿名內部類的這種方式能夠在運行時獲取泛型參數的類型呢?其實泛型類型擦除并不是真的將全部的類型信息都擦除,還是會將類型信息放在對應class的常量池中的**。 Java將泛型信息存儲在哪里? 可以參考以下網頁:[Where are generic types stored in java class files?](https://stackoverflow.com/questions/937933/where-are-generic-types-stored-in-java-class-files/937999#937999) 所以,**既然還存儲著相應的類型信息,那么我們就能通過相應的方式來獲取這個類型信息。使用匿名內部類我們就可以實現這種需求**。我們著手來設計一個能獲取所有類型信息的泛型類: import java.lang.reflect.ParameterizedType import java.lang.reflect.Type open class GenericsToken<T> { // var type: Type = Any::class.java init { val superClass = this.javaClass.genericSuperclass type = (superClass as ParameterizedType).getActualTypeArguments()[0] } } fun main(args: Array<String>) { val gt = object : GenericsToken<Map<String, String>>(){} //使用object創建一個匿名內部類 println(gt.type) } //結果 java.util.Map<java.lang.String, ? extends java.lang.String> **匿名內部類在初始化的時候就會綁定父類或父接口的相應信息,這樣就能通過獲取父類或父接口的泛型類型信息來實現我們的需求**。你可以利用這樣一個類來獲取任何泛型的類型,我們常用的Gson也是使用了相同的設計。 Gson的TypeToken實現參考以下網址:https://github.com/google/gson/blob/master/gson/src/main/java/com/google/gson/reflect/TypeToken.java 比如,我們在Kotlin中可以這樣使用Gson來進行泛型類的反序列化: val json = ... val rType = object : TypeToken<List<String>>() {}.type val stringList = Gson().fromJson<List<String>>(json, rType) 其實,**在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>

                              哎呀哎呀视频在线观看