Java语言程序设计:第七章 泛型

上传人:cl****1 文档编号:569793754 上传时间:2024-07-31 格式:PPT 页数:31 大小:374KB
返回 下载 相关 举报
Java语言程序设计:第七章 泛型_第1页
第1页 / 共31页
Java语言程序设计:第七章 泛型_第2页
第2页 / 共31页
Java语言程序设计:第七章 泛型_第3页
第3页 / 共31页
Java语言程序设计:第七章 泛型_第4页
第4页 / 共31页
Java语言程序设计:第七章 泛型_第5页
第5页 / 共31页
点击查看更多>>
资源描述

《Java语言程序设计:第七章 泛型》由会员分享,可在线阅读,更多相关《Java语言程序设计:第七章 泛型(31页珍藏版)》请在金锄头文库上搜索。

1、泛型泛型天津职业技术师范大学练习练习利用利用Java实现一个数据一个数据结构中学构中学过的的栈MyStack, MyStack用来存用来存储int型数据。型数据。天津职业技术师范大学练习练习public class MyStack private int data;private int number;public MyStack() this(10);public MyStack(int i) data = new inti;number = 0;天津职业技术师范大学练习练习public void push(int i) if (number 0);number-;return datanu

2、mber;public boolean isEmpty() return (number = 0) ? true : false;天津职业技术师范大学练习练习public static void main(String args)MyStack s=new MyStack();s.push(1);s.push(2);s.push(3);while (!s.isEmpty()System.out.println(first:+s.pop();s.push(100);s.clear();while (!s.isEmpty()System.out.println(second:+s.pop();fi

3、rstfirst:3firstfirst:2firstfirst:1如果我们要编写一个存放如果我们要编写一个存放Cirlce类对象类对象的栈,的栈,MyStack类需要做哪些改变?类需要做哪些改变?天津职业技术师范大学练习练习public class MyCirlceStack private Cirlce data;private int number;public MyStack() this(10);public MyStack(int i) data = new Cirlcei;number = 0;天津职业技术师范大学练习练习public void push(Cirlce i) if

4、 (number 0);number-;return datanumber;public boolean isEmpty() return (number = 0) ? true : false;天津职业技术师范大学练习练习public static void main(String args)MyCirlceStack s=new MyCirlceStack();s.push(new Cirlce(1) );s.push(new Cirlce(2) );s.push(new Cirlce(3) );while (!s.isEmpty()System.out.println(first:+s.

5、pop();s.push(new Cirlce(100) );s.clear();while (!s.isEmpty()System.out.println(second:+s.pop();如果我们要编写一个存放其他类对象的如果我们要编写一个存放其他类对象的栈怎么办,重复编写类?栈怎么办,重复编写类?天津职业技术师范大学使用使用ObjectObjectpublic class MyCirlceStack private Object data;private int number;public MyStack() this(10);public MyStack(int i) data = ne

6、w Objecti;number = 0;天津职业技术师范大学使用使用ObjectObjectpublic void push(Object i) if (number 0);number-;return datanumber;public boolean isEmpty() return (number = 0) ? true : false;天津职业技术师范大学使用使用ObjectObjectMyStack s1=new MyStack();s1.push(new Cirlce(1) );s1.push(new Cirlce(2) );s1.push(new Cirlce(3) );Cir

7、cle c=(Circle)s1.pop();MyStack s2=new MyStack();s2.push(new Integer(1) );s2.push(new Integer(2) );int i=(Integer)s2.pop();MyStack s3=new MyStack();s3.push(new Cirlce() );int i=(Integer)s3.pop(); /here wrong!如果我们将元素定义为如果我们将元素定义为Object类型,则类型,则其可以保存任意类型对象,但取出后必其可以保存任意类型对象,但取出后必须强制转换回相应类型。须强制转换回相应类型。这种通

8、用性的代价是丢失其原来类型,这种通用性的代价是丢失其原来类型,如果转换不正确会出现异常。如果转换不正确会出现异常。天津职业技术师范大学泛型泛型v所所谓泛型,就是在定泛型,就是在定义类、接口、方法、参数或、接口、方法、参数或成成员变量的量的时候,指定它候,指定它们操作操作对象的象的类型型为通通用用类型。型。天津职业技术师范大学泛型泛型public class MyStack private T data;private int number;public MyStack() this(10);public MyStack(int i) data = (T)new Objectinumber =

9、0;未知类型用一对未知类型用一对括起来,括起来,类型用一个字母代替类型用一个字母代替定义时声明的未知类型在定义时声明的未知类型在类中都用字母代替类中都用字母代替天津职业技术师范大学泛型泛型public void push(T i) if (number 0);number-;return datanumber;public boolean isEmpty() return (number = 0) ? true : false;天津职业技术师范大学泛型泛型MyStack s1=new MyStack();s1.push(new Cirlce(1) );s1.push(new Cirlce(2)

10、 );s1.push(new Cirlce(3) );Circle c=s1.pop();MyStack s2=new MyStack();s2.push(new Integer(1) );s2.push(new Integer(2) );int i=s2.pop();MyStack s3=new MyStack();s3.push(new Cirlce() );int i=s3.pop(); /wrong!定义对象时指定具体对象类型定义对象时指定具体对象类型取出时已自动转换为具体类型取出时已自动转换为具体类型天津职业技术师范大学从泛型类派生子类从泛型类派生子类class SuperClass

11、private U o1;private V o2;public SuperClass(U o1, V o2) this.o1 = o1; this.o2 = o2;public String toString()return U:+o1+ V:+o2;class SubClass extends SuperClasspublic SubClass(U o1, V o2) super(o1, o2);泛型类子类必须将父类所泛型类子类必须将父类所需要参数沿继承链向上传需要参数沿继承链向上传递。注意构造方法递。注意构造方法天津职业技术师范大学从泛型类派生子类从泛型类派生子类class SuperC

12、lassprivate U o1;private V o2;public SuperClass(U o1, V o2) this.o1 = o1; this.o2 = o2;public String toString()return U:+o1+ V:+o2;class SpecialSubClass extends SuperClasspublic SpecialSubClass(String o1, Integer o2) super(o1, o2);泛型类子类也可以指定具泛型类子类也可以指定具体的泛型类型。注意构造体的泛型类型。注意构造方法方法天津职业技术师范大学实现泛型接口实现泛型接

13、口public interface Generator T next();class StrIterator implements GenneratorString next()return null;class StrIterator2 implements GenneratorT next()return null;天津职业技术师范大学有界类型参数有界类型参数class Statisticsprivate T arrs;public Statistics(T arrs) this.arrs = arrs;public double count()double sum=0;for(T v:a

14、rrs)sum+=v.doubleValue();return sum;The method doubleValue() is undefined for the type T天津职业技术师范大学有界类型参数有界类型参数class Statisticsprivate T arrs;public Statistics(T arrs) this.arrs = arrs;public double count()double sum=0;for(T v:arrs)sum+=v.doubleValue();return sum;限定其是某个类型的子类限定其是某个类型的子类可以有多个上界可以有多个上界c

15、lass Test天津职业技术师范大学泛型方法泛型方法v泛型方法可以定泛型方法可以定义在泛型在泛型类或者非泛型或者非泛型类中中v语法:法:访问控制符控制符 修修饰符符 返回返回类型型 方方法名法名(参数列表参数列表)public static void genMethod(T o)System.out.println(o.getClass();天津职业技术师范大学泛型方法泛型方法public static void main(String args)max(-1,2.9,.5);public static void max(T . args)T temp = args0;for(T t:arg

16、s)if(t.doubleValue()temp.doubleValue()temp=t;System.out.println(temp);2.9天津职业技术师范大学泛型方法泛型方法public class Test public static void main(String args)Test test=new Test();test.f(string);test.f(1,1.,.1);test.f(new Test();public void f(T . args)T temp = args0;for(T t:args)System.out.println(t.getClass();cl

17、ass java.lang.Stringclass java.lang.Integerclass java.lang.Doubleclass java.lang.Doubleclass test.Test天津职业技术师范大学擦除擦除vJava采用擦除技采用擦除技术来来处理泛型。理泛型。v当当Java代代码被被编译时,全部泛型,全部泛型类型的信息会被型的信息会被擦除,用具体擦除,用具体类型来替型来替换它它们的泛型的泛型类型,如果型,如果没有指定具体没有指定具体类型,型,则默默认采用采用Object类型替型替换。v然后运用相然后运用相应的的强制制转换以以维持持类型兼容。型兼容。天津职业技术师范大学

18、擦除擦除class Generic T obj;public Generic(T obj)this.obj=obj;public T getObj()return this.obj;天津职业技术师范大学擦除擦除class Generic T obj;public Generic(T obj)this.obj=obj;public T getObj()return this.obj;天津职业技术师范大学擦除擦除class Generic T obj;public Generic(T obj)this.obj=obj;public T getObj()return this.obj;天津职业技术师

19、范大学擦除擦除天津职业技术师范大学泛型泛型MyStack s1=new MyStack();s1.push(new Cirlce(1) );s1.push(new Cirlce(2) );s1.push(new Cirlce(3) );Circle c=(Circle)s1.pop();MyStack s2=new MyStack();s2.push(new Integer(1) );s2.push(new Integer(2) );int i=(Integer)s2.pop();MyStack s3=new MyStack();s3.push(new Cirlce() );int i=(Integer)s3.pop(); /here!编了泛型而不使用,编了泛型而不使用,等于退回到等于退回到Object时代时代天津职业技术师范大学泛型的局限泛型的局限1.不能使用基本不能使用基本类型的型的类型参数,可以使用其包装型参数,可以使用其包装类型代替。型代替。2.静静态成成员无法使用无法使用类型参数。型参数。3.不能使用泛型不能使用泛型类异常异常4.不能使用泛型数不能使用泛型数组,如:,如:MyStack s=new MyStack5;5.不能不能实例化泛型例化泛型对象或数象或数组,如:,如:T t = new T(); T a=new T5;2012.3

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号