zoukankan      html  css  js  c++  java
  • 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.因为存在类型擦除,所以在运行时只能进行基本类型的查询判断

  • 相关阅读:
    【Java多线程】Fork/Join 源码分析(三十一)
    【Java多线程】Fork/Join 框架(三十)
    【Java】 Iterator(迭代器)
    【Java多线程】ScheduledThreadPoolExecutor实现原理(二十九)
    【Java多线程】ScheduledThreadPoolExecutor详解(二十八)
    【Java多线程】Executor框架 (二十七)
    【Python基础编程252 ● 包 ● 使用import 包名 as 别名 语句导包】
    【Python基础编程251 ● 包 ● 使用from 包名 import * 语句导包】
    【Python基础编程250 ● 包 ● 导包的方式】
    【Python基础编程249 ● 包 ● 包的基本概念、作用和命名规则】
  • 原文地址:https://www.cnblogs.com/huangweikun/p/5059792.html
Copyright © 2011-2022 走看看