参数化的类型: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