Java泛型通配符

  1. 關鍵字說明    
  2.     
  3. ●  ? 通配符類型    
  4.     
  5. ●  <? extends T> 表示類型的上界,表示參數化類型的可能是T 或是 T的子類    
  6.     
  7. ●  <? super T> 表示類型下界(Java Core中叫超類型限定),表示參數化類型是此類型的超類型(父類型),直至Object    
  8.     
  9. extends 示例    
  10.     
  11.     static class Food{}    
  12.     static class Fruit extends Food{}    
  13.     static class Apple extends Fruit{}    
  14.     static class RedApple extends Apple{}    
  15.     
  16.     List<? extends Fruit> flist = new ArrayList<Apple>();    
  17.     // complie error:    
  18.     // flist.add(new Apple());    
  19.     // flist.add(new Fruit());    
  20.     // flist.add(new Object());    
  21.     flist.add(null); // only work for null     
  22. List<? extends Frut> 表示 “具有任何從Fruit繼承類型的列表”,編譯器無法確定List所持有的類型,所以無法安全的向其中添加對象。可以添加null,因爲null 可以表示任何類型。所以List 的add 方法不能添加任何有意義的元素,但是可以接受現有的子類型List<Apple> 賦值。    
  23.     
  24. Fruit fruit = flist.get(0);    
  25.     
  26. Apple apple = (Apple)flist.get(0);    
  27.     
  28. 由於,其中放置是從Fruit中繼承的類型,所以可以安全地取出Fruit類型。    
  29.     
  30. flist.contains(new Fruit());    
  31.     
  32. flist.contains(new Apple());    
  33.     
  34. 在使用Collection中的contains 方法時,接受Object 參數類型,可以不涉及任何通配符,編譯器也允許這麼調用。    
  35.     
  36. super 示例    
  37.     
  38. List<? super Fruit> flist = new ArrayList<Fruit>();    
  39.     
  40. flist.add(new Fruit());    
  41.     
  42. flist.add(new Apple());    
  43.     
  44. flist.add(new RedApple());    
  45.     
  46. // compile error:    
  47.     
  48. List<? super Fruit> flist = new ArrayList<Apple>();    
  49.     
  50. List<? super Fruit> 表示“具有任何Fruit超類型的列表”,列表的類型至少是一個 Fruit 類型,因此可以安全的向其中添加Fruit 及其子類型。由於List<? super Fruit>中的類型可能是任何Fruit 的超類型,無法賦值爲Fruit的子類型Apple的List<Apple>.    
  51.     
  52. // compile error:    
  53.     
  54. Fruit item = flist.get(0);    
  55.     
  56. 因爲,List<? super Fruit>中的類型可能是任何Fruit 的超類型,所以編譯器無法確定get返回的對象類型是Fruit,還是Fruit的父類Food 或 Object.    
  57.     
  58. 小結    
  59.     
  60. extends 可用於的返回類型限定,不能用於參數類型限定。    
  61.     
  62. super 可用於參數類型限定,不能用於返回類型限定。    
  63.     
  64. 帶有super超類型限定的通配符可以向泛型對易用寫入,帶有extends子類型限定的通配符可以向泛型對象讀取。——《Core Java》   
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章