java之15天 泛型 (一)

JDK1.5 泛型

/**
 * JDK1.5 泛型
 * 泛型格式:通过<> 来定义操作的 "引用数据类型"
 * 
 * 在使用java提供的对象时,什么时候使用泛型呢?
 * 
 * 通过在集合框架中很常见
 * 只要见到 <>就要定义泛型
 * 
 * 其实<> 就是用来接受类型的
 * 当使用集合时,将集合中要存储的数据类型作为参数传递到<>中时候
 */
public class GenericDemo {

	public static void main(String[] args) {
		method_1();
		System.out.println("=======================");
		method_2();
	}
	/**
	 * JDK 1.5出现了泛型 出现的新特新,用于解决安全问题,是一个安全机制.
	 * 好处: 
	 * 1)将运行时期的问题 java.lang.ClassCastException:  转移到了编译时期.
	 *    方便程序员解决问题,让运行时期问题减少.
	 * 2)避免了强制 类型转换的麻烦
	 */
	public static void method_2(){
		ArrayList<String> al=new ArrayList<String>();
		al.add("abc01");
		al.add("abc01");
		al.add("abc01");
		//al.add(4);  编译失败 
		
		//Iterator it=al.iterator();  //JDK1.5以前 只能凭程序员主动 判断元素类型.
		Iterator<String> it=al.iterator();
		while(it.hasNext()){
			String s=it.next();  //没有进行强制转换
			System.out.println(s+":"+s.length());
		}
		
	}
	
	/**
	 * JDK升级: 高效  安全 简化书写
	 * 下面  程序编译 通过,但是运行有问题
	 * java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
	 * 分析原因就是  因为 集合中保存的值出现了 4  不是字符串类型 .所以  JDK 1.5 后就出现了泛型 
	 */
	public static void method_1(){
		
		ArrayList al=new ArrayList();
		al.add("abc01");
		al.add("abc01");
		al.add("abc01");
		al.add("abc01");
		//al.add(new Integer(4));
		al.add(4); //JDK1.5以前是不可以这样做到 只能用上面的那句话.
		
		Iterator it=al.iterator();
		
		while(it.hasNext()){
			String s=(String)it.next();
			System.out.println(s+":"+s.length());
		}
	}

}

泛型 应用 

/**
 * 泛型 应用  
 * 1.修改练习 中使用个TreeSet中  字符串长度排序
 * 2.在比较器中使用泛型 
 */
public class GenericDemo2 {
	
	public static void main(String[] args) {
		TreeSet<String> ts=new TreeSet<String>(new StrLenComparator());
		ts.add("abcde");
		ts.add("cc");
		ts.add("bad");  //长度都相同 内容不同
		ts.add("gdg");  //长度都相同 内容不同
		ts.add("hahaha");
		
		Iterator<String> it=ts.iterator();
		while(it.hasNext()){
			String s=it.next();
			System.out.println(s+":"+s.length());
		}
		
	}

}

class StrLenComparator implements Comparator<String>{

	@Override
	public int compare(String o1, String o2) {
		//倒序 将两个对象换个位置就可以了
//		int num=new Integer(o1.length()).compareTo(new Integer(o2.length()));
		int num=new Integer(o2.length()).compareTo(new Integer(o1.length()));
	
		//主要条件判断完了 判断次要条件  		
		if(num==0)
			return o2.compareTo(o1);
		
		return num;
	}
}

泛型在自定义的程序中使用

/**
 * 泛型在自定义的程序中使用
 *
 */

class Worker{
	
}

//后来多了 Student
class Student{
	
}

class Tool{
	private Worker w;
	public void setWorker(Worker w){
		this.w=w;
	}
	public Worker getWorker(){
		return w;
	}
}
//变形1 1.5以前 就这样干 扩张程序 
class Tool1{
	//这样为了兼容 Worker 和  Student 于是采用了 Object
	private Object obj;
	public void setObject(Object obj){
		this.obj=obj;
	}
	public Object getObject(){
		return obj;
	}
}

//变形3 1.5以后  泛型 做法 由调用者来确定调用的类型
class Utils<QQ>{
	private QQ q;
	public void setObject(QQ q){
		this.q=q;
	}
	public QQ getObject(){
		return q;
	}
}




public class GenericDemo3 {
	public static void main(String[] args) {
		Tool t=new Tool();
		t.setWorker(new Worker());
		t.getWorker();
		
		//正常
		Tool1 t1=new Tool1();
		t1.setObject(new Worker());
		Worker w1=(Worker)t1.getObject();
		
		//下面编译通过  运行失败 .类型转换异常
		Tool1 t2=new Tool1();
		t1.setObject(new Student());
		Worker w2=(Worker)t1.getObject();
		
		//泛型来做
		Utils<Worker> u=new Utils<Worker>();
		u.setObject(new Worker());
		//u.setObject(new Student());  编译就报错了 这样提高程序的安全性
		Worker w3=u.getObject();  //看看 不用强转了吧  
		
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值