Java泛型

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Confidential ©2013 iSoftStone Holdings Limited. All Rights Reserved.
默认的泛型限制类型
• 定义泛型类别时,如果只写以下代码:
public class Generic<T> { //.... }
• 相当于Hale Waihona Puke Baidu面的定义方式
public class Generic<T extends Object> { //.... }
Confidential ©2013 iSoftStone Holdings Limited. All Rights Reserved.
泛型成员实例化示例
• 通过方法的泛型参数,将数组的实例传递给类中 的泛型数组:
String[] strs = {"caterpillar", "momor", "bush"}; Generic3<String> f = new Generic3<String>();
[访问修饰符] class/interface 类名<泛型1,泛型2,…>{ 泛型1 泛型成员1; 泛型2 泛型成员2;
//....
}
• 声明中的泛型1、泛型2等等泛型符号可以是任意合 法的Java标识符。
Confidential ©2013 iSoftStone Holdings Limited. All Rights Reserved.
Confidential ©2013 iSoftStone Holdings Limited. All Rights Reserved.
建立类型为泛型类的数组
• 如果要建立泛型类的数组,需要注意new关键字后 面不要加入泛型的实际类型名,如下所示:
Generic<String>[] gs; //声明泛型类的数组
泛型类的声明示例
/* 此处声明了一个包含泛型T的泛型类,T代表所有可能的类型,而T 的实际类型在Generic类实例化时指定。 */ public class Generic<T> {
private T f;
//f为泛型成员
public void setF(T f) {//setF方法的参数类型为泛型T this.f = f; } public T getF() {//getF方法的返回类型为泛型T return f; } }
Confidential ©2013 iSoftStone Holdings Limited. All Rights Reserved.
泛型成员的使用
• 在泛型类中的泛型成员不能直接实例化,其实例 必须要通过方法的参数传递给泛型成员:
public class Generic3<T> { private T[] array; //此处不能用new T[]实例化array public void setArray(T[] array) { this.array = array; } public T[] getArray() { return array; } }
包含多个泛型的类定义示例
• 包含有两个泛型定义的类声明和实例化:
public class Generic2<T1, T2> { private T1 f1; private T2 f2; //.... }
//给出泛型T1,T2的实际类型 Generic<Integer, Boolean> f = new Generic<Integer, Boolean>(); //没有给出T1,T2的实际类型 Generic f1=new Generic();//T1,T2将被默认为是Object类型
Confidential ©2013 iSoftStone Holdings Limited. All Rights Reserved.
限制泛型上限类型
• extends关键字用来指定泛型的上限,在实例化 泛型类时,为该泛型指定的实际类型必须是指定 类的子类或指定接口的子接口
import java.util.List; public class ListGeneric<T extends List> { private T list; public void setList(T list) { this.list = list; } public T getList() { return list; } }
泛型成员的可用方法
• 由于泛型类型只有在类实例化后才能确定,类中 的泛型成员只能使用Object类型中的方法:
class Generic<T>{ T f; void setF(T f){ this.f=f; } //.... void doSome(){ /* getClass和toString都是Object中的方法 */ System.out.println(f.getClass().getName()); System.out.println(f.toString()); } }
Confidential ©2013 iSoftStone Holdings Limited. All Rights Reserved.
强类型集合
• 传统的集合类的实例中可以存储任意类型数据, 这种集合类称为弱类型集合类。 • JDK1.5以后,引入了强类型集合类
– 强类型集合类中,只能存储指定类型的数据 – 在强类型集合类中取出数据时,无需进行类型转换处 理,如果数据类型不配备,编译时会直接报错 – 强类型集合并没有引入新的类名,只需在定义原有集 合对象时,用尖括号(<>)指明其存储的数据类型名称 即可。
//向泛型成员array传递实际的字符串数组 f.setArray(strs); //读取泛型成员array的值,将其赋给字符串数组变量strs strs = f.getArray(); //此时array的类型为字符串数组
Confidential ©2013 iSoftStone Holdings Limited. All Rights Reserved.
泛型(Generics)
本章目录
强类型集合类 泛型类 泛型通配符 泛型方法 继承中的泛型 泛型接口和枚举 类型去除
Confidential ©2013 iSoftStone Holdings Limited. All Rights Reserved.
集合类中的数据类型
Confidential ©2013 iSoftStone Holdings Limited. All Rights Reserved.
限定泛型上限后的成员可用方法
• 泛型类型的上限一经限定,类中的泛型成员就可 使用上限类型中的方法和其他可用成员:
import java.util.List; import static java.lang.System.out;//静态导入 public class ListGeneric<T extends List> { private T list; public void setList(T list) { this.list = list; } public void doSome(){ //add、get方法都是List接口中定义的方法 list.add(new Integer(0)); out.println(list.get(0));//此处省略了System } }
实例化时的泛型的默认类型
• 泛型类实例化时,并不一定要指明泛型对应的实 际类型,此时会使用Object作为泛型的默认类型
Generic f3 = new Generic(); f3.setF(new Boolean(false));
• 编译时编译器会发出警告:
Note: Generic.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details.
//先对泛型数组进行初始化 gs=new Generic[5]; //不要写成new Generic<String>[5]
//再分别为每一个数组元素进行初始化 gs[0]=new Generic<String>();//为第一个数组元素赋值 //....
Confidential ©2013 iSoftStone Holdings Limited. All Rights Reserved.
//如果不是List的类型,编译时就会发生错误 ListGeneric<HashMap> f3 = new ListGeneric<HashMap>();
type parameter java.util.HashMap is not within its bound ListGeneric<HashMap> f3 = new ListGeneric<HashMap>();
Confidential ©2013 iSoftStone Holdings Limited. All Rights Reserved.
定义泛型(Generics)类
• 强类型集合采用了JDK1.5引入的泛型语法。 • 泛型相当于类中一种特殊的类型,这种类型的特点 是在实例化该类时可指定为某个具体的实际类型。 • 声明包含泛型的类的格式如下:
Confidential ©2013 iSoftStone Holdings Limited. All Rights Reserved.
强类型集合示例
//下面的向量类的实例中只能存储字符串类型数据 Vector<String> v=new Vector<String>(); v.add("张三"); //加入的是字符串,OK String name=v.get(0); //取出时,无需做类型转换 /* 如果想在这种强类型集合中加入日期数据,在编译时就会报 告错误 */ v.add(new Date()); //编译器会直接报告类型不匹配错误
• 在限定泛型的类型时,无论要限定的是接口或是 类,都要使用extends关键词
Confidential ©2013 iSoftStone Holdings Limited. All Rights Reserved.
限制泛型上限类型的示例
ListGeneric<Vector> f1 = new ListGeneric<Vector>(); ListGeneric<ArrayList> f2 = new ListGeneric<ArrayList>();
Confidential ©2013 iSoftStone Holdings Limited. All Rights Reserved.
泛型类的实例化
• 创建泛型类的实例时,可以使用一对尖括号指定泛 型的真正类型
//f1中的泛型T在此指定为Boolean类型 Generic<Boolean> f1 = new Generic<Boolean>();
//f2中的泛型T在此指定为Integer类型 Generic<Integer> f2 = new Generic<Integer>(); //f1的setF方法只能接受Boolean类型数据 f1.setF(new Boolean(true)); Boolean b = f1.getF(); System.out.println(b); //f2的setF方法只能接受Integer类型的数据 f2.setF(new Integer(10)); Integer i = f2.getF(); System.out.println(i); Confidential ©2013 iSoftStone Holdings Limited. All Rights Reserved.
• 集合类中可以存储各种数据,数据一旦存入,其类 型均会转化为Object类型。 • 从集合类中取出数据时,一般均需要将Object类型 转换回存入之前的实际类型
Vector v=new Vector(); v.add("张三"); //存入字符串 String name=(String)v.get(0); //强制类型转换,OK v.add(new Date()); //存入当前时间对象,OK /* 由于Date类型不能转换为String,下面语句会在运行时发生 错误,但这种错误在编译时不会被检查出来 */ String date=(String)v.get(1); //编译器不会发现这里有问题
相关文档
最新文档