40-泛型--前世今生

来源:互联网 发布:统计相同数据的个数 编辑:程序博客网 时间:2024/05/05 18:37

1、什么是泛型?

  泛型:任意的类型。是一种把明确数据类型的工作放在了创建对象或者调用方法时候进行的特殊的类型,一般只应用在集合里。

  泛型的格式:<数据类型>,举例如下:

[java] view plain copy
  1. <span style="font-size:14px;">ArrayList<String> array = new ArrayList<String>();</span>  
2、为什么有泛型?泛型有什么好处?

  为什么有泛型:我们知道,数组只能存储一种数据类型;集合可以存储任意类型的对象,但是我只想让我的存储一种类型,不想让其他类型存进去,怎么解决呢?

  这时候就要用泛型了,泛型就是模仿数组限定存入数据类型而来的,在定义集合的时候,告诉集合,限定集合只能存储什么类型的元素(如果不明确指定则默认是object类型)。以上面泛型举例,ArrayList<String> array = new ArrayList<String>();就是限定集合array只能存入string类型数据。

  泛型的好处:

    (1)解决了虚拟机黄色警告问题,因为如果不加泛型的话,虚拟机会认为存在因操作失误存入非正常数据的可能,而报出黄色警告。

    (2)把运行期间的类型转换异常提前到了编译期间,定义泛型之后,如果存入非泛型规定类型数据,虚拟机会报错而导致编译不通过。

    (3)优化程序设计,使得代码更清晰。

3、什么时候使用泛型?

  如果类或者接口后面有 < > ,那么这就是泛型的体现。它就是要你在使用的时候明确类型,这时候就可以使用泛型了。

4、泛型的种类?

  泛型一般的用法有泛型类、泛型方法、泛型接口。

  (1)泛型类

    顾名思义,泛型类就是把泛型定义在类上。举例如下:

[java] view plain copy
  1. <span style="font-size:14px;">public class Tool2<E> {  // 泛型不明确类型则默认object类型  
  2.       
  3.     private E temp;  
  4.   
  5.     public void show(E e) {  
  6.         System.out.println( 胡根得 );  
  7.     }  
  8. }</span>  
    定义成这样,说明方法传递的参数必须和泛型类的类型一致,这时候,泛型类的使用方法如下:

[java] view plain copy
  1. <span style="font-size:14px;">public class Tool2Test {  
  2.     public static void main(String[] args) {  
  3.   
  4.         Tool2<String> t = new Tool2<String>(); //泛型类定义成string类型  
  5.         t.show("hello");  
  6.   
  7.         Tool2<Integer> t2 = new Tool2<Integer>(); //泛型类定义成Integer类型  
  8.         t2.show(10);  
  9.     }  
  10. }</span>  

  (2)泛型方法

    从上边可以知道,我们用泛型类可以使得泛型类的方法传递不同类型的参数(上面分别传递了string和Integer类型),但是我们需要在泛型类和其方法上都加上泛型。那么,我们能不能在调用方法的时候,才去明确类型呢?

    这就用到了泛型方法,泛型方法就是把泛型加在方法上。举例如下:

[java] view plain copy
  1. <span style="font-size:14px;">public class Tool {  
  2.   
  3.     //泛型方法  
  4.     public <E> void show(E e) { //没有指定,所以默认object类型均可  
  5.         System.out.println( 胡根得 );  
  6.     }  
  7. }</span>  
    使用的时候:

[java] view plain copy
  1. <span style="font-size:14px;">public class ToolTest {  
  2.     public static void main(String[] args) {  
  3.   
  4.         //不用在类上也加上泛型啦!  
  5.         Tool t = new Tool();  
  6.   
  7.         t.show("hello");  
  8.         //真正实现了一个方法,传递多种参数,比方法重载简单多了  
  9.         t.show(10);  
  10.     }  
  11. }</span>  

  (3)泛型接口

    把泛型加在接口上。泛型接口有什么特点呢?

    首先定义一个泛型接口:

[java] view plain copy
  1. <span style="font-size:14px;">//定义泛型接口  
  2. public interface Inter<BMW> { //没有指定类型,默认为object类型  
  3.     public abstract void show(BMW bmw);  
  4. }</span>  
    定义类实现这个接口:

  (1)在写实现类的时候,已经知道接口上应该是什么类型了,例如应该是string类型:

[java] view plain copy
  1. <span style="font-size:14px;">//直接加上类型string  
  2. public class InterImpl implements Inter<String> { //在泛型处指定string类型  
  3.     @Override  
  4.     public void show(String bmw) {  
  5.         System.out.println(bmw);  
  6.     }  
  7. }</span>  

    调用方式:

[java] view plain copy
  1. <span style="font-size:14px;">public class InterTest {  
  2.     public static void main(String[] args) {  
  3.         // 方式1测试  
  4.          InterImpl ii = new InterImpl(); //直接创建对象  
  5.          ii.show("hello");  
  6.     }  
  7. }</span>  

  (2)在写实现类的时候,不知道接口上应该是什么类型:

[java] view plain copy
  1. <span style="font-size:14px;">public class InterImpl<BWM> implements Inter<BWM> {//这时候类上的泛型仍然用父接口中的bwm类型  
  2.     @Override  
  3.     public void show(BWM bmw) {  
  4.         System.out.println(bmw);  
  5.     }</span>  

    调用方式:

[java] view plain copy
  1. <span style="font-size:14px;">public class InterTest {  
  2.     public static void main(String[] args) {  
  3.   
  4.         // 方式2测试,调用的时候才定义类型  
  5.         InterImpl<String> ii = new InterImpl<String>(); //需要用泛型类的方式创建对象  
  6.         ii.show("hello");  
  7.     }  
  8. }</span>  

  小结:泛型属于新特性,是高新类技术,在很多方面多有用处。既可以规定必须用哪种类型,又可以代替方法重载,传递多种参数。


转载地址:http://blog.csdn.net/fightfaith/article/details/50001461

0 0
原创粉丝点击