




已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、课程名称:泛型问题引出 2、知识点 2.1、上次 课程的主要知识点 小的新特性: JDK1.5:自动装箱和拆箱、可 变参数、foreach、静 态导 入。 JDK1.7:switch 支持 string. JDK1.8:方法中定义内容部 类参数可以不加 final 了。 2.2、本次 预计讲解的知识点 1、泛型产生动 机; 2、泛型的使用及通配符; 3、泛型方法的使用; 3、具体内容( ) JDK1.5 后的三大主要新特性:泛型、枚举、Annotation. 3.1、泛型的 产生背景 假如说现在要求你你定义一个表示坐标的类:Point, 在这个类 中存放有两两个属性:x 坐标、 y 坐标。 但是由于此类的的设计特殊,现 在在实际使用使用中有可能出现以下三种结构的数据: 整数:x=10、y=12; 小数:x=10.1 、y=10.3; 字符串:东经 100 度,北 纬 30 度。 现在发现在 point 里面可以保存三种数据 类型,而 point 类中应该只会存在两个属性:x、y. 很明显, 现在唯一可以想到的一定是 object 类型,因 为满足于如下的转换: 保存 int:int自动装箱为 Integer向上转型为 object. 保存 double:double自动装箱为 Double向上转型为 Object. 保存字符串:String向上转型为 Object. 范例:定义 Point 类 class Point private Object x; private Object y; public void setX(Object x) this.x=x; public void setY(Object y) this.y=y; public Object getX() return x; public Object getY() return y; 于是下面通过一些重复的操作,分 别保存好三个内容。 范例:坐标为整数 /* * param args */ public static void main(String args) /第一步:设置坐标数据 Point p = new Point(); p.setX(10); p.setY(20); /第二步:取得坐标数据 int x = (Integer) p.getX(); int y = (Integer) p.getY(); System.out.println(“x=“+x+“,y=“+y); x=10,y=20 范例:保存小数 /* * param args */ public static void main(String args) /第一步:设置坐标数据 Point p = new Point(); p.setX(10.1); p.setY(20.2); /第二步:取得坐标数据 double x = (Double) p.getX(); double y = (Double) p.getY(); System.out.println(“x=“+x+“,y=“+y); x=10.1,y=20.2 范例:保存字符串 /* * param args */ public static void main(String args) /第一步:设置坐标数据 Point p = new Point(); p.setX(“东京100 度“ ); p.setY(“北纬30度“); /第二步:取得坐标数据 String x = (String) p.getX(); String y = (String) p.getY(); System.out.println(“x=“+x+“,y=“+y); x=东京100 度,y=北纬30度 以上的操作的确是满足了开发要求,但是最 严重的问题也同时产生了。整个代 码的实现关键在于利 用了 Object 类 型。利用 Object 操作的优点在于可以接收所有的数据 类型,但是缺点也就是因为优点 造成的:Object 要接收我们的数据,那么都必须进行强制性的向下 转型。 范例:可能带来的隐患。 public class TestDemo /* * param args */ public static void main(String args) /第一步:设置坐标数据 Point p = new Point(); p.setX(100);/理论上要保存String p.setY(“北纬30度“); /第二步:取得坐标数据 String x = (String) p.getX(); String y = (String) p.getY(); System.out.println(“x=“+x+“,y=“+y); Exception in thread “main“ java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String at cn.mldn.demo.TestDemo.main(TestDemo.java:31 ) 以上的代码本质上讲一定会存在有问题的,但是 现在的程序中明显无法发现这样的问题,因 为 Object 本身就可以存放 Integer,但是这个代码是在项目执行的时候出错。 所以现在通过分析就可以发现,向下转型这样的操作本身就会存安全隐患问题,而且 这种隐患是不 能够在编译的时候检查出来的。 传统利用 Object 来进行处理的操作永 远都有这样的问题。 那么现在既然已经出现了这样的问题,用什么 样的方式要以解决此问题呢?唯一的方案,不 进行对 象的向下转型。但是不转型又打破了好不容易建立起来的一些优势。所以在 这样的背景下产生了泛 型技术。 泛型的本质:类中的属性或者是方法的参数,在类定义的时候不设置具体的类型,只使用一个 标记表 示,而在这些类使用的时候才会 为其动态的绑定一种数据类型。 范例:使用泛型 class Point/T:Type, P:Param,R:return. private T x; private T y; public void setX(T x) this.x=x; public void setY(T y) this.y=y; public T getX() return x; public T getY() return y; 实际上这里面就告诉我们的使用者,此 时 Point 类中的属性类 型无法确定,必须在类实例化对象的时 候绑定。 范例:使用泛型实例化类对象 public class TestDemo /* * param args */ public static void main(String args) /第一步:设置坐标数据 Point p = new Point(); p.setX(“东经100 度“); p.setY(“北纬20度“ ); /第二步:取得坐标数据 String x = p.getX(); String y = p.getY(); System.out.println(“x=“+x+“,y=“+y); 此时没有出现 所谓的向上或者向下转型,并且操作的类型都是动态分配的。 如果在应用了泛型技术类使用的时候没有设置泛型类型,JDK 默认也不会认为它出现了语法错误。 也能够执行,同时使用 Object 作为默认类型。 3.2、通配符 :? 现在假设有如下的一个泛型类: class Message private T info; public void setInfo(T info) =info; public T getInfo() return info; 首先类的对象一定是可以发生引用传递操作的,所以以上的代码也可以进行对象的引用传 递。 范例:编写代码 public class TestDemo /* * param args */ public static void main(String args) Message msg = new Message(); fun(msg); System.out.println(msg.getInfo(); public static void fun(Message temp) temp.setInfo(“HELLO“); 但是泛型可以改变,所以现在将以上使用的泛型类型由 String 变为 Integer.这个时候 fun()方 法将不能够正常使用,并且由于重载是受到参数类型而不是泛型类型的限制,那么也无法 通过重载来解决此问题,可是这样的问题的怎么解决呢?那么现在就必须有一种类型可以 接收全部的泛型种类,于是一位同学说了:方法里不用泛型 声明了。 范例:不使用范型,则 Object 描述 public class TestDemo /* * param args */ public static void main(String args) Message msg = new Message(); fun(msg); System.out.println(msg.getInfo(); public static void fun(Message temp) temp.setInfo(“哈哈哈,世界和平!“) ; 这个时候需要一种标记,这种标记就必须满足如下要求: 可以用于泛型上,这样可以避免安全警告; 这个标记使用之后,允许接收任何内容,但是不修改里面的数据; 为此在泛型中提供了有一个重要的通配符”?”; 范例:使用通配符描述 public class TestDemo /* * param args */ public static void main(String args) Message msg = new Message(); fun(msg); msg.setInfo(100); System.out.println(msg.getInfo(); public static void fun(Message temp) System.out.println(temp.getInfo(); 但是在此通配符的基础上又扩展出了两个子通配符组合: ?extends 类:设置泛型的上限,此 设置可以设置在类 或者是方法参数中; |-“? Extends Number”:表示可以使用的泛型只能够是 Number 或者 是 Number 的子 类; ?super 类:设置泛型的下限,可以设置在方法参数中; |-“?super String”:表示只能设 置 Sring 或者是其父类 Object; 范例:设置泛型折上限 package cn.mldn.demo; import java.awt.Point; class Message private T info; public void setInfo(T info) =info; public T getInfo() return info; public class TestDemo /* * param args */ public static void main(String args) Message msg = new Message(); msg.setInfo(1000); fun(msg); public static void fun(Message temp) System.out.println(temp.getInfo(); 范例:设置泛型的下限 package cn.mldn.demo; import java.awt.Point; class Message private T info; public void setInfo(T info) =info; public T getInfo() return info; public class TestDemo /* * param args */ public static void main(String args) Message msg = new Message(); msg.setInfo(“1000“); fun(msg); public static void fun(Message temp) System.out.println(temp.getInfo(); 以后如果在看文档的时候会出现许多这样的标记。要求能看懂。 3.3、泛型接口( 重点) 在接口上用泛型就是泛型接口。 interface Message/接口:Ixx、抽象类: Abstractxxx、普通类:直接写 public void print(T t);/此方法上使用了泛型 此时实现了泛型接口,但是对于泛型接口的子类有两种实现模式: 模式一:在子类继续使用泛型声明。 package cn.mldn.demo; import java.awt.Point; interface IMessage/接口:Ixx 、抽象类: Abstractxxx、普通类:直接写 public void print(T t);/此方法上使用了泛型 class MessageImpl implements IMessage public void print(P t) System.out.print(t); public class TestDemo /* * param args */ public static void main(String args) IMessage msg = new MessageImpl(); msg.print(“HELLO“); 模式二:在子类使用时不使用泛型,直接 为父接口设置好泛型类型。 package cn.mldn.demo; import java.awt.Point; interface IMessage/接口:Ixx 、抽象类: Abstractxxx、普通类:直接写 public void print(T t);/此方法上使用了泛型 class MessageImpl implements IMessage Override public void print(String t) / TODO Auto-generated method stub System.out.print(t); public class TestDemo /* * param
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 七年级体育 体育锻炼必须遵循科学的锻炼方法教学设计
- 初中英语教科版(五四学制)九年级上册Unit 6 A United Effort获奖教案设计
- 反假币业务培训大纲
- 2024中电信翼智教育科技有限公司招聘6人笔试参考题库附带答案详解
- 半导体安全生产培训
- 2024中建一局一公司浙江分公司商务法务部合约主管招聘笔试参考题库附带答案详解
- 人教统编版3 鸿门宴第4课时教学设计及反思
- 华师大版七年级上册1 有理数的乘法法则教案及反思
- 超市培训课件
- 车间班组安全管理培训
- 2025年春季学期形势与政策第二讲-中国经济行稳致远讲稿
- 家长要求学校换老师的申请书
- 常见生物相容性实验汇总
- 综合探究三 探寻丝绸之路(课堂运用)
- 企业重组相关税收政策培训教学课件(38张)
- 肝癌的防治(大众科普版本)-PPT课件
- 成都高新区小学数学五年级下册半期考试数学试卷
- 职业危害防治实施管理台账
- 2018年人教版九年级英语单词表
- 毕业设计U型管换热器设计说明书
- 苹果中国授权经销商协议
评论
0/150
提交评论