泛型类:泛型类型的子类及通配符的使用



本文讲述以下几个方面内容试图介绍说明泛型类型子类及通配符使用 
  (1)    子类及替换原则;
  (2)    使用extends关键字通配符;
  (3)    使用super关键字通配符;
  (1)    子类及替换原则
  在java语言中我们通俗讲个类是另个类子类型是通过使用extends关键字去继承某个类或者使用implements关键字去实现某些接口这样我们在编程时就可以面向接口或基类进行编程如:
  Number num1 = Integer(1);
  Number num2 = Double(2.1d);
  这个就是所谓替换原则替换原则定义是:
  Substitution Principle: a variable of a given type may be assigned a value of any subtype of that type and a method with a parameter of a given type may be invoked with an argument of any subtype of that type.
  大概意思是说某种类型变量可以被该类型任何子类所赋值个思路方法中参数也可以被该参数任何子类进行
  现在我们再来看看泛型中替换原则适用性:
  Example2.1
  List<Number> listNums = ArrayList<Number>();
  nums.add(10);
  nums.add(8.88);
  在example2.1 中可以看出替换原则被很好地应用在这里ArrayList是List子类我们提供给listNums变量类型参数为Number往 listNums中添加元素时10被封箱为Integer类型而Integer是Number子类第 3行情况类似
  Example2.2
  List<Integer> List = ArrayList<Integer>();
  List<Number> numList = List;   //compile error
  …
  numList.add(1.35); // can‘t do that
  根据替换原则我们会很容易想到既然Integer是Number子类则我们应该可以将List<Integer>变量赋给 List<Number>变量但从实际情况表明List<Integer>并不是List<Number>子类
  我们不妨试想想若果List<Integer>类型变量可以成功赋值给List<Number>类型变量会出现什么情况?我们可能在某个位置添加个double类型元素进去numList中而实质上在numList中其它元素都是Integer 类型元素这样就违背了泛型初衷了
  有时我们确实希望将形如List<Integer>List对象赋给List<Number>变量这时就要使用extends关键字通配符
  (2)    使用extends关键字通配符
  Example2.3
  List<Integer> List = ArrayList<Integer>();
  List<? extends Number> numList = List();
  …
  numList.add(1.35); //compile error (can‘t do that)
  从Example2.3看到numList这个变量我们可以将类型参数为Number及其Number子类List赋给它
  记住条规则如果你使用了“? extends T”般情况下你不能往该数据结构中put元素而你可以做就是get元素
  如果要往内put元素就需要使用下面提到super关键字通配符 [Page]
  (3)    使用super关键字通配符
  Example2.4
  List<Integer> List = ArrayList<Integer();
  List<? super Integer> numList = List;
  numList.add(3); //can put eger or null
  在example2.4 我们可以看到<? super Integer>意思为我们可以将类型参数为Integer或Integer超类List赋给 numList变量并且可以put元素到列表中(注意:在该例子中put进元素只能为Integer或null类型)
  条比较通用规则:如果要往List中put元素则用<? super T>如果要从List中get元素则用<? extends T>如果既要get又要put则不使用通配符  

Tags:  java泛型 泛型类有什么作用 java泛型类 泛型类

延伸阅读

最新评论

发表评论