标签:
/**
* 泛型的前世今生(泛型类的使用)
* 【学习结果】
1,了解泛型类,泛型方法,泛型接口的定义体现形式。
2,自定义泛型类,体会泛型前和泛型后的区别★★★★★
【目标:自定义泛型】
1,没有泛型之前,对于不确定的对象类型,是通过Object类型多态方式解决的。
弊端:当对象提升为Object后,需要向下转型才可以使用对象的内容。
而转型就会有运行发生ClassCastException异常的风险。
2,有了泛型后,将不确定的类型定义成参数,把Object替换成参数类型。
好处是:1.调用者在使用时必须先明确类型,如果操作的对象类型不符符合,直接编译失败。
2.类型符合,使用对象特有方法时,不需要进行强制转换。
3,泛型类,泛型方法,泛型接口的体现。
4,注意:
4.1 类上的泛型是在创建该类对象时进行类型明确。
4.2 静态方法无法访问类上定义的泛型,如果需要泛型,只能定义在方法上。
*/
public class GenericDemo2 {
public static void main(String[] args) {
//part2:
// ObjTool tool = new ObjTool();
// tool.setObj("hehe");
// String str = tool.getObj(); //编译出错,原因在于传参时存的是Obj类型,向上造型.
// String str = (String) tool.getObj();
// System.out.println(str);
//用户传入数字6
// tool.setObj(6); //编译没问题,因为6也造型为Object,语法上没问题.
// String six = (String) tool.getObj(); //我们用同样的方法取数值发现
//java.lang.ClassCastException: 类型转换异常
/*JDK1.5之前,就是用Object这样的办法,来扩展类型
*但是在需要特有功能时,需要强转,麻烦.另外还有可能引发运行异常*/
//part3:
ObjTool<String> tool = new ObjTool<String>();
tool.setObj("haha");
String str = tool.getObj(); //1.无需强转了
// tool.setObj(6); //2.编译失败.类型不匹配,编译就报错,避免了运行时的类型异常.
}
}
/**part4: 将曾经的模拟队列数据结构加上泛型
* 定义自制队列数据结构
* 模拟用 遵循先进后出
*/
class MyQueue<Q> {
/*封装一个链表数据结构*/
private LinkedList<Q> queue;
/*注意:初始化MyStack
* new一个链表数据结构的列表*/
public MyQueue(){
queue = new LinkedList<Q>();
}
//模拟queue添加元素的方法(栈添加的是尾部的元素,也就是先进入的元素放在尾部)
public void add(Q obj){
queue.addFirst(obj);
//注意:存入的元素顺序,每一个在下一个的前面位置存放.
}
//模拟queue获取元素的方法(栈获取的是尾部的元素,也就是先入的元素)
public Object get(){
return queue.removeLast();
//注意1.因为是模拟队列,不能用LinkedList的get方法,那样不会移除头部的元素.
// 2.移除的是每次尾部的元素.根据上面add方法所述,即最先进入的元素在尾部,所以会先移除.
// 这样才符合栈的数据结构特点: 先进先出. 或者说后进后出.
}
//判断stack是否为空
public boolean isEmpty(){
return queue.isEmpty();
}
}
/**
* part1:
* 定义一个工具,对对象进行操作,比如设置和获取
* 注意:现在的Tool只能操作String,如果现在还需要操作Integer类型的获取和设置.
* 那么需要在建立一个类,定义成Tool2 get ,setInteger方法,显然很麻烦.
* 那么就需要把String和Integer的共性部分向上抽取,即共性类型Object类型.
* 所以可以写成如下ObjTool. 看part2:
* part3: jdk1.5有了新技术,泛型,改成如下这样。
* 类中操作的对象确定不?不确定,用Object,需要转型,运行容易出异常。不爽。
* 在定义时,就将不确定的对象的类型,定义成参数。由使用该类的调用者来传递对象类型。
*/
class ObjTool <T>{ //将泛型定义在类上,叫做泛型类
private T obj;
public T getObj() {
return obj;
}
public void setObj(T obj) {
this.obj = obj;
}
}
/*class ObjTool { //实验完毕注释掉 part2
private Object obj;
public Object getObj() {
return obj;
}
public void setObj(Object obj) {
this.obj = obj;
}
}*/
/*class Tool { //实验完毕注释掉
private String str;
*//**
* 获取str
* @return
*//*
public String getStr() {
return str;
}
*//**
* 设置str
* @param str
*//*
public void setStr(String str) {
this.str = str;
}
}*/
GenericDemo2 泛型类的使用
标签:
原文地址:http://www.cnblogs.com/zyjcxc/p/5453424.html