15.泛型

1.類型參數
 public class Holder<T>
 不用特別指定具體類型。
2.返回多個對象
  元組:將一組對象存在單一對象。也稱爲數據傳送對象。
  public class Tuple<A,B>
3.基本類型無法作爲類型參數。
4.泛型方法
   原生類型<T>
  public <T> void  f<T x> 將泛型參數列表置於返回值之前。
  public <T> void  f<T...x>泛型可變參數,不用顯式填充數組x
  public static <K,V> Map<K,V> map(){
   return new HashMap<K,V>();
  }
  Map<String,List<String>> sls = New.map();這就是類型參數推斷
 
  New.map();//不能編譯,不知道類型
  New.<String,List<String>>map();//顯式類型說明

5.擦除
  Class c1 = new ArrayList<String>().getClass(); 
  Class c2 = new ArrayList<Integer>().getClass(); 
  c1==c2//true
  Arrays.toString(c1.getTypeParameters())//E
  在泛型代碼內部,無法獲得任何有關泛型參數類型的信息。
6.邊界
  在編寫泛型代碼時,都要記住它只是一個Object,嚴格來說是是它的第一邊界。
  任何在運行時需要知道確切類型信息的操作都將無法工作。
  T extends Hasf 那麼Hasf就是T的第一邊界。
7.通配符
  一個數組new Apple[]可以持有Apple及其子類。
  List<Fruit> flist = new ArrayList<Fruit>();//不能寫成new ArrayList<Apple>(),
  Apple的List不是Fruit的List,Apple的List可以持有Apple及其子類型,Fruit的list則可以持有任何類型的Fruit。

  List<? extends Fruit> flist = new ArrayList<Apple>();//什麼都不能添加,下界不確定。
  從編譯器的角度考慮,它要持有Fruit或Fruit的某種子類型,但不知道是那種類型,所以就無法安全的向其中添加任何對象。
  這裏雖然指明爲Apple,但是編譯器並不知道,添加任何類型都是不安全的。
 
  List<? super Apple> flist ;//可以添加Apple及其子類,其下界就是Apple
  List<? super T>可以,<T super Apple>不合法,T是泛型參數,有可能傳錯。

  無界通配符
  List<Integer>  li = new ArrayList<Integer>;
  li.add(new Integer(12));
  List<?> lu = li;
  lu.add(new Integer(43));//error
  對於lu, 編譯器不能對List的類型參數做出足夠嚴密的推理。
  add方法類型安全,但是lu擦除並不能確定所加對象的類型。                        
  引入類型通配符,可以從中檢索元素,但是不能添加元素。修改功能的方法比不修改方法需要更多的類型信息。
  lu.clear();可以運行,因爲它不依賴類型安全。
 
8.泛型問題
  a.不能保存基本類型
    不能創建ArrayList<int>,可以用ArrayList<Integer>但是性能低。
  b.一個類不能實現同一個泛型接口的兩種變體
    如interface Fruit<t>{} 那麼
    Class A extends Fruit<Apple> implements Fruit<Orange>{};//error 
    擦除會使兩個接口相同。
  c.帶有泛型參數的轉型和instanceof不會有任何效果
  d.重載
    void f(List<T> v){}
    void f(List<W> v){}
    擦除使兩個方法相同。
9.動態類型安全
  容器的ArrayList<Dog> dl = new ArrayList<Dog>();
  雖然有類型安全,但還是有可能加入錯的數據。
  @SupressWarning("nochecked")  
  public void addCat(List dogl){
   dogl.add(new Cat());
  }   
  addCat(dl);//這是可以的。
  所以List<Dog> dl2 = Collections.checkList(dl,Dog.class);//加入類型檢查
  持續更新中。。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章