项目6 通用堆栈
1 项目介绍 本项目使用泛型定义一个通用堆栈,使其能保存任何一种数据类型,包括类库中所有的类以及自定义的类。图6-1是保存String型和Double型数据的运行结果:
2 泛型 【例6-1】定义一个泛型类,对String对象执行操作。 class Box<T> { private T t; void set(T t) this.t = t; } T get() return t; public class Example6_1 public static void main(String[] args) Box<String> b = new Box<String>( ); b.set("Hello!"); String s = b.get(); System.out.println(s); //b.set(new Integer(22));
2 泛型 什么版本的泛型类的变量就只能引用什么版本的泛型类的对象,例如,下列代码将出现编译错误: Box<String> s = new Box<Date>( ); 创建String版Box的对象以后,就可以调用Box中定义的方法,例如: b.set("Hello!");
3 包装类及自动包装和自动解包 Java为每种基本数据类型都定义了包装类,分别是:Double、Float、Long、Integer、Short、Byte、Character和Boolean,这些类都在java.lang中 数值类型的包装类都定义了以数值为参数以及以字符串为参数的构造方法,例如: Double(double value) //以double值为参数创建Double对象 Double(String s) //以String为参数创建Double对象 Integer(int value) //以int值为参数创建Integer对象 Integer(String s) //以String为参数创建Integer对象
3 包装类及自动包装和自动解包 数值类型的包装类都继承了抽象类Number,并继承了下列Number定义的方法: byte byteValue( ) double doubleValue( ) float floatValue( ) int intValue( ) long longValue( ) short shortValue( )
3 包装类及自动包装和自动解包 【例6-2】用int值创建Integer对象,返回这个对象的int、double、String型的值,用字符串创建Double对象,返回这个对象的int、double、String型的值。 public class Example6_2 { public static void main(String[] args) //把int值转化为String和double型 Integer i = new Integer(3); System.out.println(i.intValue()); // 获取int型的值 System.out.println(i.doubleValue()); // 获取double型的值 String s = i.toString(); // 获取String型的值 System.out.println(s); //把String型的浮点数转化为int型和double型 Double d = new Double("5.5"); System.out.println(d.intValue()); System.out.println(d.doubleValue()); System.out.println(d.toString()); }
3 包装类及自动包装和自动解包 从J2SE5开始,Java添加了自动包装和自动解包功能。例如,下列代码通过自动包装创建值为10的Integer对象: Integer i = 10; 代码中并没有使用关键字new调用构造方法,创建对象的过程是自动完成的。同样道理,要自动解包,只需要将该对象的引用赋给int型变量,例如: int ii = i; // i是Integer变量,引用了Integer对象
4 约束类型变量 如果对通用堆栈做出限制,要求其只能操作整数和浮点数,即入栈和出栈对象只能是Double、Float、Long、Integer、Short或Byte的对象,就必须重新定义堆栈类。 上述数值类型包装类都是Number类的子类。本任务将使用约束类型变量定义一个堆栈类,使得堆栈只能操作Number子类的对象。
4 约束类型变量 声明约束类型变量,是在类型变量的后面使用extends指定其超类,以这个超类作为类型变量的上界约束,传送给类型变量的类只能是这个类或它的子类。