天天看點

JavaSE:泛型泛型

JavaSE:泛型

  • 泛型
    • 泛型的使用
    • 自定義泛型結構
      • 自定義泛型類、接口
      • 自定義泛型方法
      • 泛型在繼承方面的展現
      • 通配符的使用

泛型

所謂泛型,就是允許在定義類、接口時通過一個辨別辨別類中某個屬性的類型或者是某個方法的傳回值及參數類型。這個類型參數将在使用時(例如:繼承或實作某個接口,用這個類型聲明變量、建立對象時)确定(即傳入實際的類型參數,也稱為類型實參)。

泛型的使用

不使用泛型示例:

JavaSE:泛型泛型

使用泛型示例:

JavaSE:泛型泛型

泛型是使用,解決了元素存儲的安全性問題,解決擷取資料元素時,需要類型強制轉換的問題。

在集合中使用泛型:

  1. 集合接口或集合類在jdk 5.0時,都修改為待泛型的結構。
  2. 在執行個體化集合類時,可以指明具體的泛型類型
  3. 指明完以後,在集合類或接口中凡是定義類或接口時,内部結構使用到類的泛型的位置時,都指定為執行個體化的泛型類型。
    1. 比如 add(E e) —> 執行個體化以後:add(Integer e)
  4. 注意點:泛型的類型必須是類,不能是基本資料類型。需要用到基本資料類型的位置,用包裝類代替
  5. 如果執行個體化沒有指明泛型的類型。預設類型為java.lang.Object

自定義泛型結構

說明:

  1. 泛型可以有多個參數,此時應将多個參數一起放在尖括号内。比如:<K,V>
  2. 泛型類的構造器:public Student(){}
  3. 執行個體化後操作原來泛型位置的結構必須與指定的泛型類性一緻
  4. 泛型不同的引用不能互相指派。
  5. 泛型如果不指定,将被擦除,泛型對應的類型均按照Object處理,但不等于Object。
  6. 如果泛型類是一個接口或抽象類,則不可建立泛型類的對象
  7. jdk7,泛型的簡化操作:ArrayList< String > list = new ArrayList<>();
  8. 泛型的指定中不能使用基本資料類型,可以使用包裝類替換
  9. 在類/接口上聲明的泛型,本類或本接口中即代表某種類型,可以作為非靜态屬性的類型、非靜态方法的參數類型、非靜态方法的傳回值類型。但在靜态方法中不能使用類的泛型
  10. 異常類不能使用泛型

自定義泛型類、接口

JavaSE:泛型泛型

自定義泛型類中泛型相當于一個形參,需要在執行個體化時傳入指定的類型,若不指定類型,則預設為Object類。

JavaSE:泛型泛型
JavaSE:泛型泛型

在子類繼承中,若子類在繼承泛型的父類時,指明了泛型類型。則執行個體化子類對象時,不再需要指明泛型。

自定義泛型方法

示例:

JavaSE:泛型泛型

運作結果:

JavaSE:泛型泛型

說明:

  • 泛型方法,在方法中出現了泛型的結構,泛型參數與類的泛型參數沒有任何關系,即泛型方法所屬的類是不是泛型類并沒有關系。
  • 泛型方法,可以聲明為靜态的。因為,泛型參數是在調用方法時确定的,并不是在執行個體化時确定的。

泛型在繼承方面的展現

類A是類B的父類,G< A > 和G< B >二者不具備子父類

JavaSE:泛型泛型

通配符的使用

JavaSE:泛型泛型
  1. List<?>是List< String >、List< Object >等各種泛型List的父類。
  2. 讀取List<?>的對象list中的元素時,永遠是安全的,因為不管list的真實類型是什麼,它包含的都是Object。
  3. 無法使用add方法向使用通配符的集合中添加資料,因為泛型中還是一個未知類型。唯一例外是null,因為null是所有類型的成員。
  4. 另一方面,我們可以調用get()方法并使用其傳回值。傳回值是一個未知的

    類型,但是我們知道,它總是一個Object