<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 功能強大 支持多語言、二開方便! 廣告
                # 1. 泛型定義 **1.泛型,即“參數化類型”。一提到參數,最熟悉的就是定義方法時有形參,然后調用此方法時傳遞實參。那么參數化類型怎么理解呢?顧名思義,就是將類型由原來的具體的類型參數化,類似于方法中的變量參數,此時類型也定義成參數形式(可以稱之為類型形參),然后在使用/調用時傳入具體的類型(類型實參)。** 2.規范的數據的格式,增加程序的健壯性,例如一個集合中如果既有String,又有int,那么程序運行就會有問題如下: ``` public class GenericTest { public static void main(String[] args) { List list = new ArrayList(); list.add("qqyumidi"); list.add("corn"); list.add(100); for (int i = 0; i < list.size(); i++) { String name = (String) list.get(i); // 1 發生異常 System.out.println("name:" + name); } } } ``` 定義一個簡單泛型 ~~~ package com.aixin.tuna.fanxing; public class GenericTest { public static void main(String[] args) { Box<String> name = new Box<>("corn"); //傳入類型實參 System.out.println("name:" + name.getData()); } } class Box<T> { //定義類型形參 private T data; public Box() { } public Box(T data) { this.data = data; } public T getData() { return data; } } ~~~ 輸出: ``` name:corn ``` #### **那么對于不同傳入的類型實參,生成的相應對象實例的類型是不是一樣的呢?** ``` public class GenericTest { public static void main(String[] args) { Box<String> name = new Box<String>("corn"); Box<Integer> age = new Box<Integer>(712); System.out.println("name class:" + name.getClass()); // com.qqyumidi.Box System.out.println("age class:" + age.getClass()); // com.qqyumidi.Box System.out.println(name.getClass() == age.getClass()); // true } } ``` 此,我們發現,在使用泛型類時,雖然傳入了不同的泛型實參,但并沒有真正意義上生成不同的類型,傳入不同泛型實參的泛型類在內存上只有一個,即還是原來的最基本的類型(本實例中為Box),當然,在邏輯上我們可以理解成多個不同的泛型類型。 究其原因,在于Java中的泛型這一概念提出的目的,導致其只是作用于代碼編譯階段,在編譯過程中,對于正確檢驗泛型結果后,會將泛型的相關信息擦出,也就是說,成功編譯過后的class文件中是不包含任何泛型信息的。泛型信息不會進入到運行時階段。 **對此總結成一句話:泛型類型在邏輯上看以看成是多個不同的類型,實際上都是相同的基本類型。** # 二.類型通配符 接著上面的結論,我們知道,Box和Box實際上都是Box類型,現在需要繼續探討一個問題,那么在邏輯上,類似于Box和Box是否可以看成具有父子關系的泛型類型呢? ![](https://box.kancloud.cn/4ff611425f750261dd7e19f9e0392224_916x533.png) 假設Box在邏輯上可以視為Box的父類,那么//1和//2處將不會有錯誤提示了,那么問題就出來了,通過getData()方法取出數據時到底是什么類型呢?Integer? Float? 還是Number?且由于在編程過程中的順序不可控性,導致在必要的時候必須要進行類型判斷,且進行強制類型轉換。顯然,這與泛型的理念矛盾,因此,**在邏輯上Box不能視為Box的父類。** 好,那我們回過頭來繼續看“類型通配符”中的第一個例子,我們知道其具體的錯誤提示的深層次原因了。那么如何解決呢?總部能再定義一個新的函數吧。這和Java中的多態理念顯然是違背的,因此,我們需要一個在邏輯上可以用來表示同時是Box和Box的父類的一個引用類型,由此,**類型通配符應運而生。** **類型通配符一般是使用 ? 代替具體的類型實參。注意了,此處是類型實參,而不是類型形參!且Box在邏輯上是Box、Box...等所有Box的父類。由此,我們依然可以定義泛型方法,來完成此類需求。** ``` public class GenericTest { public static void main(String[] args) { Box<String> name = new Box<String>("corn"); Box<Integer> age = new Box<Integer>(712); Box<Number> number = new Box<Number>(314); getData(name); getData(age); getData(number); } public static void getData(Box<?> data) { System.out.println("data :" + data.getData()); } } ``` 有時候,我們還可能聽到**類型通配符上限和類型通配符下限**。具體有是怎么樣的呢? 在上面的例子中,如果需要定義一個功能類似于getData()的方法,但對類型實參又有進一步的限制:只能是Number類及其子類。此時,需要用到類型通配符上限。 ``` public class GenericTest { public static void main(String[] args) { Box<String> name = new Box<String>("corn"); Box<Integer> age = new Box<Integer>(712); Box<Number> number = new Box<Number>(314); getData(name); getData(age); getData(number); //getUpperNumberData(name); // 1 getUpperNumberData(age); // 2 getUpperNumberData(number); // 3 } public static void getData(Box<?> data) { System.out.println("data :" + data.getData()); } public static void getUpperNumberData(Box<? extends Number> data){ System.out.println("data :" + data.getData()); } } ``` 此時,顯然,在代碼//1處調用將出現錯誤提示,而//2 //3處調用正常。 **類型通配符上限通過形如**Box形式定義,**相對應的,類型通配符下限為Box形式,其含義與類型通配符上限正好相反**,在此不作過多闡述了。
                  <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>

                              哎呀哎呀视频在线观看