关于java泛型的一些概念

关于java泛型其实挺复杂的,之前看文档的时候做过一些泛型名词摘记,今天把这这个笔记放到博客上来,以后抽空完善这篇关于泛型的文章  

一  类型参数(Type parameters)

二  泛型子类型(Subtyping)  
    有点违反OOP的直觉
  List<String>  listStr = new ArrayList<String>();
  List<Object> listObj = listStr;  不允许

三 泛型通配符(Wildcards):
     Collection<?> 和Collection<Object>区别
     type parameter is ?, it stands for some unknown type.  ?表示未知类型

四  边界通配符(Bounded Wildcards):
  List<Shape> shapes 与List<? extends Shape> shapes2的区别
List<? extends Shape> shapes2允许接收类型为Shape和Shape的子类型
   Shape是通配符的上界

五  泛型方法(Generic Methods)  
  static void fromArrayToCollection(Object[] a, Collection<?> c) {
for (Object o : a) { 
        c.add(o); // compile-time error
    }
}
  编译错误,正确的写法是static后面void的前面加上泛型声明
static <T> void fromArrayToCollection(T[] a, Collection<T> c) {
for (T o : a) {
        c.add(o); // Correct
    }
}

六  泛型方法和通配符使用区别  


七  泛型参数命名约定:
E: element
T: Type
K: Key
V;Value

八  遗留代码 
  raw type :像Collection这样的泛型类型,不使用类型参数(type paramter)被称为raw type 
遗留代码API操作集合未使用泛型,新代码调用的集合可以使用泛型参数。  遗留代码修改 支持泛型 修改过后的API二进制兼容老的客户端

九  未检查警告(unchecked warning):


十  上边界  下边界(lower bound)
  下边界通配符  ? super T 

   上边界通配符 ? extend T

十一  上下边界泛型使用区别
In general, if you have an API that only uses a type parameter T as 
an argument, its uses should take advantage of lower bounded wildcards (? 
super T). Conversely, if the API only returns T, 
you'll give your clients more flexibility by using upper bounded wildcards 
(? extends T).

十二  通配符捕获(wildcard Capture)


十三 Multiple bounds 多边界
   

十四  协变(convariant)  逆变(contravariant)  可变(variance)  不变(invariant)


2 协变(convariant):String是Object的子类,如果List<String>是List<Object>的子类 则称为协变
3 逆变(contravariant):String是Object的子类,如果List<String>是List<Object>的父类 则称为逆变
4 可变(variance):如果带类型参数的类型支持协变或逆变,这称为可变
5 不变(invariant):即不支持协变也不支持逆变,则称为不变

十五  通配符类型(Wildcard types):如果类型参数未知,使用?表示,比如List<?> list = new ArrayList<>(); 由于List的泛型参数E具体类型未知,不能像list写入任何对象。
list.add("ONE")  提示The method add(capture#1-of ?) in the type List<capture#1-of ?> is not applicable for the arguments (String)


十六  类型擦除(Erasure):支持泛型的类或方法,泛型信息只在编译阶段起作用,运行时泛型的类型信息已经被擦除,
比如list 在运行时不能感知到底是List<String> 还是List<Object>

十七  PECS原则(producer-extends, comsumer-super)
  指导如何使用上边界和下边界原则

十八  递归类型

  比如Integer类的,Integer extends Number implements Comparable<Integer>

十九  类型推导(type inference)

  从java7开始,编译器可以自动推到泛型类型参数比如

Map<String, List<String>> myMap = new HashMap<String, List<String>>();

  可以将HashMap后面的泛型参数省略,只用<>

Map<String, List<String>> myMap = new HashMap<>(); 

猜你喜欢

转载自junlintianxia.iteye.com/blog/2200646