java泛型 泛型數組相關概念理解

參數化的類型:list<String>

實際類型參數:String

泛型:List<E>

形式類型參數: E

無限制通配符類型: List<?>

原生態類型: List

有限制類型參數: <E extends Number>

遞歸類型限制: <T extends Comparable<T>>

有限制通配符類型: List<? extends Number>

泛型方法: static <E> List<E> asList(E[] a)

類型令牌: String.class

數組跟泛型有兩點不一樣: java

1、數組是協變的:若是Sub爲Super的子類型,那麼Sub[]就是Super的子類型,而List<Sub>不是List<Super> 的子類型; 數組

2、數組是具體化的:數組在運行時才知道並檢查元素類型約束,若是類型不一致就會出現ArrayStoreException異常。而泛型在編譯期就知道類型是否知足約束; this

也正是因爲這些緣由,數組和泛型不能很好的混合使用。全部建立泛型、參數化類型或者類型參數的數組都是非法的。如:new List<E>[] , new List<String>[] , new E[]。都是不容許的。 spa

參數化的類型:
List<Object> list1 = List<Object>();//correct:能放入全部類型
List<Object> list2 = List<Dog>();//error:想定義能夠放入全部類型,又想限定只能放Dog類型,邏輯錯誤
Object[] objs = new Dog[10];//correct:只能放入Dog類型的數組
List<Object>[] obl = new List<Object> [10];//error:泛型數組不能new建立
List<Object>[] obl= new List[10];//correct:
泛型:E和泛型方法
class Cat<E> {
  private E e;
  //error:提示靜態方法不能引用非靜態E
  public static Cat<E> getInstance(){
    return new Cat<E>();
  }
  //correct
  public static <E> Cat<E> getInstance(){
    return new Cat<E>();
  }
  public E getEInstance() {
    return this.e;
  }
}


無限制通配符<?>
/**error:不能這麼建立集合,必須制定集合類型參數**/
Set<?> set = new HashSet<?>();
/**能夠這麼建立集合,可是該集合只能接受null**/
Set<?> set = new HashSet<Object>();
Class<?> clazz = WildCard.class;//correct
Cat<?> c = new Cat();//warning
//correct
public void get(Set<?> set1,Set<?> set2) {
    for(Object os : set1) {
	set2.contains(os);
    }
}


有限制類型參數<E extends Number>和有限制通配符類型<? extends Number>
//error:這種形式的類型參數只能用在定義類或者方法裏
List<E extends Pet> ccc = new ArrayList<Dog> ();
//correct:和通配符<?>同樣,只能放入null;
List<? extends Pet> cct = new ArrayList<Dog>();
//correct:能取出正確的類型
Dog[] dogs = new Dog[2];
dogs[0] = new Dog();
dogs[1] = new Dog();
List<? extends Pet> cct = Arrays.asList(dogs);
//如Cat<E>類,也能夠這樣使用
Cat<? extends Pet> cc = new Cat<Dog>();

參考:Effective Java code

相關文章
相關標籤/搜索