java中的泛型

一、何为泛型

  泛型,即为广泛的类型。设计了一个泛型类,我们可以往里面填充广泛的类型。在创建的时候只要往里面填充特定的类型,就要得到自己想要的对象。泛型类似于一个瓶子,我们要喝水的往水瓶里面装水就可以得到一瓶矿泉水。我们想喝可乐的时候往瓶子里面转入可乐,便可以得到一瓶可乐。

二、泛型的语法

  class Test<T>{

  private T parameter;

  public Test(){
    this.parameter = parameter;
  }

  public T getParameter(){
    return parameter;
  }

  public void setParameter(T parameter){

    this.parameter = parameter;

  }

 }

 这样子便可以在java中定义一个泛型类,使用class Test<Double> = new Test<Double>()便可以创建一个泛型类对象。

 class GenericMethodClass{

   public static <T> T genericMethod(T a){

   }

 } 

 使用这样的语法,便可以创建一个java泛型方法。Double b = 2.0;GenericMethodClass.<Double>genericMethod(b)便可以调用这个方法,也可以直接GenericMethodClass.genericMethod(b)进行,java编译器会自动根据b的类型进行推断调用何种方法。这里为什么要使用Double引用类型而不使用基本类型double呢?就是因为泛型类型参数只能是引用类型,而不能是基本基本类型。

 三、泛型在虚拟机中的实现

  java虚拟机里面是没有泛型类这个概念的,所有的泛型在虚拟机中都会被用原生类型来代替,这就是所谓的java虚拟机的类型擦除

  class  Test<T>{

    private T parameter;

    public T getParameter(){

      return parameter;

    }

  }

  这样的一个泛型类在运行的时候,在虚拟机中会被类型擦除成下面这种形式

  class Test{

    private Object parameter;

    public Object getParameter(){

      return parameter;

    }

  }

  如果一个泛型的类型T有限定,则会使用限定类型去替换 

  Class Test<T extends Comparable>{

    private T parameter;

    public T getParameter(){

      return parameter;

    }

  }

  在虚拟机中则会被替换成

  Class Test{

    private Comparableparameter;

    public Comparable getParameter(){

      return parameter;

    }

  }

    因为在java虚拟机中存在类型擦除,所以在执行泛型函数的时候,获取泛型类型的变量是自动插入强制类型转换

  Test<Double> test = new Test<Double>();

  Double a = test.getParameter();

  test.getParameter拿到的变量是一个Object类型的,因为变量a是Double类型的,所以在执行这个函数的时候,java虚拟机会自动加入强制类型转换。

四、java泛型的约束

  1.泛型的类型参数只能是引用类型的,而不能是基本类型的。

  2.不能创建参数化的类型数组

  3.因为存在类型擦除,所以在运行时只能进行基本类型的查询判断

posted @ 2016-01-04 22:44  守、护  阅读(317)  评论(0编辑  收藏  举报