欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java之15天 泛型 (一)

程序员文章站 2022-06-04 23:19:01
...
[size=medium][b]JDK1.5 泛型[/b][/size]

/**
* 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());
}
}

}

[size=medium][b]泛型 应用 [/b][/size]

/**
* 泛型 应用
* 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;
}
}

[size=medium][b]泛型在自定义的程序中使用[/b][/size]

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

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(); //看看 不用强转了吧

}

}