Java基础--泛型


凌风博客原创作品。转载请注明出处http://blog.csdn.net/q549130180/article/details/45198649

泛型:JDK1.5 版本以后出现新特性,用于解决安全问题,是一个类型安全机制


好处
1.将运行时期出现问题ClassCastException,转移到了编译时期
方便于程序员解决问题,让运行时期问题减少,安全

2.避免了强制转换麻烦

泛型格式:通过<>来定义要操作的引用数据类型

在使用java提供的对象时,什么时候写泛型呢?

通常在集合框架中很常见
只要见到<>就要定义泛型

其实<>就是用来接收类型的

当使用集合时,将集合中要存储的数据类型作为参数传递到<>中即可

代码实现如下:


[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. class GenericDemo  
  2. {  
  3.     public static void main(String[] args)   
  4.     {  
  5.         ArrayList<String> al = new ArrayList<String>();  
  6.   
  7.         al.add("abc01");  
  8.         al.add("abc02");  
  9.         al.add("abc03");  
  10.   
  11.         //al.add(4);  
  12.   
  13.         Iterator<String> it = al.iterator();  
  14.         while (it.hasNext())  
  15.         {  
  16.             String s = it.next();  
  17.   
  18.             System.out.println(s+":"+s.length());  
  19.         }  
  20.     }  
  21. }  

泛型类

什么时候定义泛型类?
当类中要操作的引用数据类型不确定的时候
早期定义Object来完成扩展
现在定义泛型来完成扩展

代码实现入下:


[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. class Utils<QQ>  
  2. {  
  3.     private QQ q;  
  4.     public void setObject(QQ q)  
  5.     {  
  6.         this.q = q;  
  7.     }  
  8.     public QQ getObject()  
  9.     {  
  10.         return q;  
  11.     }  
  12. }  
  13. class GenericDemo2   
  14. {  
  15.     public static void main(String[] args)   
  16.     {  
  17.         Utils<Worker> u = new Utils<Worker>();  
  18.   
  19.         u.setObject(new Student());  
  20.         Worker w = u.getObject();  
  21.         /* 
  22.         Tool t = new Tool(); 
  23.         t.setObject(new Student()); 
  24.         Worker w = (Worker)t.getObject(); 
  25.         */  
  26.     }  
  27. }  


泛型方法

泛型类定义的泛型,在整个类中有效,如果被方法使用
那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了

为了让不同方法可以操作不同类型,而且类型还不确定
那么可以将泛型定义在方法上

特殊之处:
静态方法不可以访问类上定义的泛型。
如果静态方法操作的应用数据类型不确定,可以将泛型定义在方法上。

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. class Demo<T>  
  2. {  
  3.     public <T> void show(T t)  
  4.     {  
  5.         System.out.println("show:"+t);  
  6.     }  
  7.   
  8.     public <Q> void print(Q q)  
  9.     {  
  10.         System.out.println("print:"+q);  
  11.     }  
  12.     public static <w> void method(w t)  
  13.     {  
  14.         System.out.println("method"+t);  
  15.     }  
  16. }  
  17.   
  18. public class GenericDemo3   
  19. {  
  20.     public static void main(String[] args)   
  21.     {  
  22.         Demo <String> d = new Demo<String> ();  
  23.   
  24.         d.show("haha");  
  25.         //d.show(4);  
  26.         d.print(5);  
  27.         d.print("hehe");  
  28.   
  29.         Demo.method("hahahahahha");  
  30.   
  31.     }  
  32. }  


泛型接口

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. interface Inter<T>  
  2. {  
  3.     void show(T t);  
  4. }  
  5. class InterImpl<T> implements Inter<T>  
  6. {  
  7.     public void show(T t)  
  8.     {  
  9.         System.out.println("show:"+t);  
  10.     }  
  11. }  
  12.   
  13. class GenericDemo4  
  14. {  
  15.     public static void main(String[] args)   
  16.     {  
  17.         InterImpl<Integer> i = new InterImpl<Integer>();  
  18.         i.show(4);  
  19.     }  
  20. }  

泛型限定

?:通配符,也可以理解为占位符
泛型的限定:
? extends E:可以接收E类型或者E的子类型,上限。
? super E:可以接收E类型或者E的父类型,下限。


[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. class genericDemo5  
  2. {  
  3.     public static void main(String[] args)   
  4.     {  
  5.         ArrayList<Person> al = new ArrayList<Person>();  
  6.         al.add(new Person("abc1"));  
  7.         al.add(new Person("abc2"));  
  8.         al.add(new Person("abc3"));  
  9.         //printColl(al);  
  10.   
  11.         ArrayList<Student> al1 = new ArrayList<Student>();  
  12.         al1.add(new Student("abc--1"));  
  13.         al1.add(new Student("abc--2"));  
  14.         al1.add(new Student("abc--3"));  
  15.         printColl(al1);  
  16.   
  17.   
  18.           
  19.     }  
  20.   
  21.     public static void printColl(ArrayList<? extends Person> al)  
  22.     {  
  23.         Iterator<? extends Person> it = al.iterator();  
  24.   
  25.         while (it.hasNext())  
  26.         {  
  27.             System.out.println(it.next().getName());  
  28.         }  
  29.     }  
  30. }  
  31. class Perosn  
  32. {  
  33.     private String name;  
  34.     Person(String name)  
  35.     {  
  36.         this.name = name;  
  37.     }  
  38.   
  39.     public String getName()  
  40.     {  
  41.         return name;  
  42.     }  
  43. }  
  44. class Studnet extends Person  
  45. {  
  46.     Student(String name)  
  47.     {  
  48.         super(name);  
  49.     }  
  50. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值