当前位置: 首页 > news >正文

大气医院网站模板设计公司网站模板

大气医院网站模板,设计公司网站模板,wordpress还是phpcms,开发公司产品部课件本文将尝试将通配符和泛型中的继承,多态一并讲解 关于泛型中继承的注意事项 因为Integer、Double继承了Number,根据多态性,以下语句是合法的 Number n new Integer(10); // OK, 父类引用变量可以指向子类对象 n 2.9 // OK,n实…

本文将尝试将通配符和泛型中的继承,多态一并讲解

关于泛型中继承的注意事项

因为Integer、Double继承了Number,根据多态性,以下语句是合法的

Number n = new Integer(10); // OK, 父类引用变量可以指向子类对象
n = 2.9 // OK,n实际上会指向一个新的Double对象

但是注意,像ArrayList()、ArrayList()和ArrayList没有任何继承关系,考虑以下这个例子:

List<Integer> li = new ArrayList<Integer>();
List<Number> ln = li; // illegal,这一句不合法
ln.add(new Float(3.1415)); //这一句本来是合法,因为Float继承了Number。

对象ln是List类型,ln.add(new Float(3.1415))其实是合法的

但是如果你允许List类型的引用指向List,那么ln就是li的一个别名,这个List理论上就是个Integer列表,不能放Float类型对象了,这就产生了矛盾

而多态本身就是在运行时确定对象真正的类型,所以编译时发现不了ln.add(new Float(3.1415))其实已经不合法了

索性,编译时就不允许List ln = li

需要注意,以下这种泛型类是有继承关系的

//不替换
public class ArrayList<E> extends AbstractList<E>implements List<E> { //ArrayList后面必须添加<E>boolean add(E e);E get(int index);
}//替换
public class StringArrayList extends ArrayList<String> { boolean add(String e); //方法重写String get(int index);
}

这时,以下的继承关系都是正确的:

请添加图片描述

通配符类型

通配符介绍

上节说了半天,像ArrayList和ArrayList两者完全没有继承关系,其实就是为了引出通配符

因为这时泛型似乎不能利用多态的优点了,比如我就想在我的工具类里编写一个针对各种Number类型List的求和方法,我总不能对每种Number类型都写一个重载方法,这其实又违背了多态的理念

public Number sum(List<Number> list) {//求和
}

这种情况就可以用到通配符:?

例如这个求和方法就可以写成:

public Number sum(List<? extends Number> list) {//求和//get
}

这里的语义是:sum方法的入参可以是任何Number类型的List。(实际上,List<Integer>,List <Double>都属于List<? extends Number>的子类,因此多态性就可以体现出来了,这里的继承关系后面会进行总结

(需要注意的是,这时的sum方法其实已经不属于泛型方法了,“?”和类型参数“T”相比,不属于一个类型的形参,它其实和Integer、Number一样都属于实际类型,只不过它是“不确定类型”)

深入理解通配符

各种类型的通配符及继承关系

这一小节尝试将通配符和继承关系一并讲解:

其实,理解通配符的一个要点就是:通配符就是在泛型中实现多态的一种方式

通配符的种类有三种:

  1. 限定上界的通配符 List<? extends Number>
  2. 限定下界的通配符 List<? super Integer>
  3. 无界通配符 List<?>

同时,这些带通配符的类型,有以下的继承关系:

请添加图片描述

限定上界的通配符:上一节中我们已经编写了一个针对各种Number类型List的求和方法,利用的就是限定上界的通配符,因为List<Integer>,List<Double>等各种Number类型List都是List<? extends Number>的子类,所以我们将List<? extends Number>作为形参,很好地利用了多态性

限定下界的通配符:而限定下界的通配符,是希望未知类型“?”是某种特定类型的超类,比如说工具类中有一个方法是向list中添加Integer类型变量,那么这个list的类型可以是List, List, 或List,因为它们都可以存Integer类型,这时就可以用到限定下界的通配符

public static void addNumbers(List<? super Integer> list) {for (int i = 1; i <= 10; i++) {list.add(i);}
}

从继承关系上看,这时的参数可以是List,当然也可以是List

无界通配符:其实List<?>就是List<? extends Object>,对比之前限定上界的例子,我们使用List<? extends Number>来声明求和方法,也是因为Number变量可以直接用+进行相加,但一般的Object变量没有相加的能力。换句话说,如果我们用List<?>来编写方法,我们仅会用到内部对象作为Object时的能力。
比如,编写一个方法让任何对象的list都能够逐一输出:

public static void printList(List<?> list) {for (Object elem: list)System.out.print(elem + " ");
}

另一种场景是,我们编写的方法用到了泛型类,但是调用的都是该泛型类中不依赖于类型参数的方法。
例如Collections中的shuffle方法,用于打乱list的顺序,其实它的逻辑就是将list中元素逐一和任意元素进行交换,因此需要遍历,调用list.size(), 而这个方法并不关心list<E>中的类型参数到底是啥

public static void shuffle(List<?> list, Random rnd)

各种类型通配符的使用指导

这里主要翻译官方教程的使用指导:

  1. 如果你使用的泛型类对象,是一个“in”变量,即为代码提供数据,就应该使用extends关键字
  2. 如果你使用的泛型类对象,是一个“Out”变量,即保存代码中的数据,就应该使用super关键字
  3. 如果仅会用到Object类定义的方法来访问“in”变量,就使用无界通配符
  4. 如果对象既是in或者out变量,就不要使用通配符
  5. 以上这些使用指导不适用于通配符出现在返回值的情况

Collections的copy方法其实就证实了前两点

public static <T> void copy(List<? super T> dest, List<? extends T> src) 

这里个人的理解是:限定输入类型的上界,输出类型的下界,这样数据从输入到输出会是向上转型,会是安全的。

另外,官方教程中也提到,一旦参数的类型是List<? extends …>,最好就让它只读,因为根据继承关系可能有以下问题

//自然数类
class NaturalNumber {private int i;public NaturalNumber(int i) { this.i = i; }// ...
}//偶数类
class EvenNumber extends NaturalNumber {public EvenNumber(int i) { super(i); }// ...
}List<EvenNumber> le = new ArrayList<>();
List<? extends NaturalNumber> ln = le;
ln.add(new NaturalNumber(35));  // 异常
http://www.hkea.cn/news/178203/

相关文章:

  • 金山石化网站建设广告电话
  • 网站开发 前景网络推广代理
  • 温州整站推广咨询seo网站推广专员
  • 企业营销型网站团队百度seo排名优化教程
  • 安徽平台网站建设哪里好网络策划与营销
  • 做网站接广告赚钱么凡科建站和华为云哪个好
  • 成都网站建设科技公seo营销外包公司
  • 重庆有哪些做网站 小程序的百度搜索引擎的特点
  • 仁怀哪里可以做网站自动秒收录网
  • 重庆市建设局网站推广软件一键发送
  • 合肥网络推广网络运营网站seo诊断分析和优化方案
  • 网站优化公司免费咨询sem优化推广
  • 个人做网站赚钱么宁波seo推荐推广平台
  • 员工支付做网站的费用分录成都营销型网站制作
  • 专业做网站的公司邢台专业做网站关键词搜索优化
  • 电商网站建设方案模板杭州百度首页优化
  • 网站建设服务价格东莞市网站建设
  • 网站开发所需要的的环境佛山网络推广哪里好
  • php网站的优点关键路径
  • 电子政务与网站建设 总结湖南网站推广
  • 境外网站做网站涉黄互联网媒体广告公司
  • 河南做网站公司汉狮怎么做蛋糕
  • 哈 做网站网店代运营收费
  • 制作网页的三大技术是什么郑州seo顾问
  • 网站建设报价流程行业网站网址
  • 提供邯郸做wap网站网页推广方案
  • 网站从域名广告营销公司
  • 网站链接的常见形式免费广告网
  • 微信微网站开发教程百度大数据平台
  • 网站服务设计引流推广是什么意思