泛型的拆箱与装箱解读

  • 泛型
    • 百度百科解读
    • 定义分类
    • 个人理解及参考解读
    • 泛型的使用
      • 泛型类
      • 泛型接口

泛型

百度百科解读

泛型是程序设计语言的一种特性。允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明。各种程序设计语言和其编译器、运行环境对泛型的支持均不一样。将类型参数化以达到代码复用提高软件开发工作效率的一种数据类型。泛型类是引用类型,是堆对象,主要是引入了类型参数这个概念。

定义分类

泛型的定义主要有以下两种:
1.在程序编码中一些包含类型参数的类型,也就是说泛型的参数只可以代表类,不能代表个别对象。(这是当今较常见的定义)
2.在程序编码中一些包含参数的类。其参数可以代表类或对象等等。(人们大多把这称作模板)不论使用哪个定义,泛型的参数在真正使用泛型时都必须作出指明。
一些强类型编程语言支持泛型,其主要目的是加强类型安全及减少类转换的次数,但一些支持泛型的编程语言只能达到部分目的。

个人理解及参考解读

泛型——就是参数化类型,避免了用object 拆箱与装箱,效率上有所提升,关键是解决了类型安全的问题。
我们写代码 通常是依赖于抽象 而不依赖于具体。 在运行时,通过多态的方式进行注入 满足里氏替代原则。 这样也方便扩展,满足开闭原则。
那么在实际项目中使用范型是不是浪费代码的空间和效率呢?答案是:经验中往往这种通过包装过的结构 在最后 release代码 优化阶段最后都被简化成实际需要的业务类型的定义。(主要看目的)

问:装箱是将值类型转换成引用类型,拆箱是将引用类型转换成值类型。这个问题。。
答:Java的装箱是基本数据类型转换为包装器类型,拆箱是包装器类型转化为基本数据类型。

因为子类可以实例化父类,为了使所写的类更加通用,用了object类型,子类放入object类型中是装箱,在用的时候 强制类型转换是拆箱。 类似ArrayList这样的类,都依赖于装箱和拆箱。但是,这种方式不能避免类型安全问题。
例如: object a = 5 ——装箱。 int b = (int)a——拆箱。object[] obj = new object[2]obj[0]=1obj[1]="Hello Word" 等等 会产生类型安全问题。即在编译的时候 没有问题,但运行的时候可能会出错。

泛型的使用

泛型有三种使用方式,分别为:泛型类、泛型接口、泛型方法

泛型类

泛型类型用于类的定义中,被称为泛型类。通过泛型可以完成对一组类的操作对外开放相同的接口。最典型的就是各种容器类,如:List、Set、Map。

泛型类的最基本写法:

class 类名称 <泛型标识:可以随便写任意标识号,标识指定的泛型的类型>{private 泛型标识 /*(成员变量类型)*/ var; .....}
}

一个最普通的泛型类:

//此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型
//在实例化泛型类时,必须指定T的具体类型
public class Generic<T>{ //key这个成员变量的类型为T,T的类型由外部指定  private T key;public Generic(T key) { //泛型构造方法形参key的类型也为T,T的类型由外部指定this.key = key;}public T getKey(){ //泛型方法getKey的返回值类型为T,T的类型由外部指定return key;}
}
//泛型的类型参数只能是类类型(包括自定义类),不能是简单类型
//传入的实参类型需与泛型的类型参数类型相同,即为Integer.
Generic<Integer> genericInteger = new Generic<Integer>(123456);//传入的实参类型需与泛型的类型参数类型相同,即为String.
Generic<String> genericString = new Generic<String>("key_vlaue");
Log.d("泛型测试","key is " + genericInteger.getKey());
Log.d("泛型测试","key is " + genericString.getKey());
8-9  21:35:24.432 13063-13063/? D/泛型测试: key is 123456
8-9  21:35:24.432 13063-13063/? D/泛型测试: key is key_vlaue

定义的泛型类,就一定要传入泛型类型实参么?并不是这样,在使用泛型的时候如果传入泛型实参,则会根据传入的泛型实参做相应的限制,此时泛型才会起到本应起到的限制作用。如果不传入泛型类型实参的话,在泛型类中使用泛型的方法或成员变量定义的类型可以为任何的类型。

注意:
泛型的类型参数只能是类类型,不能是简单类型。
不能对确切的泛型类型使用instanceof操作。如下面的操作是非法的,编译时会出错。

 if(ex_num instanceof Generic<Number>){ }

泛型接口

泛型接口与泛型类的定义及使用基本相同,泛型接口常被用在各种类的生产器中,可以看一个例子:

//定义一个泛型接口
public interface Generator<T> {public T next();
}

当实现泛型接口的类,未传入泛型实参时:

/*** 未传入泛型实参时,与泛型类的定义相同,在声明类的时候,需将泛型的声明也一起加到类中* 即:class FruitGenerator<T> implements Generator<T>{* 如果不声明泛型,如:class FruitGenerator implements Generator<T>,编译器会报错:"Unknown class"*/
class FruitGenerator<T> implements Generator<T>{@Overridepublic T next() {return null;}
}

当实现泛型接口的类,传入泛型实参时:

/*** 传入泛型实参时:* 定义一个生产器实现这个接口,虽然我们只创建了一个泛型接口Generator<T>* 但是我们可以为T传入无数个实参,形成无数种类型的Generator接口。* 在实现类实现泛型接口时,如已将泛型类型传入实参类型,则所有使用泛型的地方都要替换成传入的实参类型* 即:Generator<T>,public T next();中的的T都要替换成传入的String类型。*/
public class FruitGenerator implements Generator<String> {private String[] fruits = new String[]{"Apple", "Banana", "Pear"};@Overridepublic String next() {Random rand = new Random();return fruits[rand.nextInt(3)];}
}

了解及测试泛型参考博文:java 泛型详解链接

泛型的拆箱与装箱解读相关推荐

  1. .NET面试题解析(02)-拆箱与装箱

    转自:  http://www.cnblogs.com/anding/p/5236739.html 常见面试题目: 1.什么是拆箱和装箱? 2.什么是箱子? 3.箱子放在哪里? 4.装箱和拆箱有什么性 ...

  2. java装箱和拆箱的意义_java的自动拆箱和装箱是每个程序员都要知道的

    自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来一些看一下装箱和拆箱中的若干问题.本文先讲述装箱和拆箱最基本的东西. 自动装箱和拆箱从Java 1.5开始引入,目的是将原始类型值转自动 ...

  3. Java基础之拆箱和装箱

    一.什么是拆箱和装箱 1)什么是拆箱 • 拆箱:将包装类类型转换为基本数据类型 • 拆箱调用Integer.intValue方法 2)什么是装箱 • 装箱:将基本数据类型转换为包装类类型 • 装箱调用 ...

  4. Java中的拆箱与装箱

    我们先来了解一下拆箱与装箱的概念: 装箱:将基本数据类型转换为包装类: 拆箱:将包装类转换为基本数据类型 我们来看两串代码: Integer b1 = 127;Integer b2 = 127;Sys ...

  5. Java包装类、拆箱和装箱详解

    虽然 Java 语言是典型的面向对象编程语言,但其中的八种基本数据类型并不支持面向对象编程,基本类型的数据不具备"对象"的特性--不携带属性.没有方法可调用. 沿用它们只是为了迎合 ...

  6. 对象包装器与自动(拆箱)装箱+参数数量可变的方法+枚举类

    [0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 自动拆箱(装箱).printf的参数数量可变 以及 枚举类的详细说明: 0.2) 源代码: h ...

  7. 第十七节:易混淆的概念(静态和非静态、拆箱和装箱)

    一. 静态和非静态 1. 概念介绍 ① 静态类(被static修饰) vs  普通类(没有被static修饰) ② 静态成员:被static修饰的成员,比如:静态方法.静态字段等 ③ 普通成员(实例成 ...

  8. java中byte装箱和装箱_Java包装类、拆箱和装箱详解

    虽然 Java 语言是典型的面向对象编程语言,但其中的八种基本数据类型并不支持面向对象编程,基本类型的数据不具备"对象"的特性--不携带属性.没有方法可调用. 沿用它们只是为了迎合 ...

  9. Java知多少(24)包装类、拆箱和装箱详解

    虽然 Java 语言是典型的面向对象编程语言,但其中的八种基本数据类型并不支持面向对象编程,基本类型的数据不具备"对象"的特性--不携带属性.没有方法可调用. 沿用它们只是为了迎合 ...

最新文章

  1. Linq基础知识小记二
  2. 【每日一算法】两个列表的最小索引总和
  3. oc开发之block详解
  4. Augmented World Expo(AWE)重磅来袭!
  5. Java实现话术词槽匹配_桔子互动|百度UNIT操作详解(上篇)
  6. JAVA怎么创建对象组_java – 如何根据特定字段创建一组有序的对象?
  7. 五种网络管理技巧优化网络办公环境
  8. Java虚拟机(JVM)的内存划分
  9. listview选中高亮
  10. (转)Windows Form Application 读取并修改App.config文件
  11. js获取url传递参数
  12. Android 键盘映射
  13. 迷你迅雷(官方版)不含广告,不用会员,多线程急速
  14. 直接将ADB授权写入到手机的方法(手机需要有root权限)
  15. 基于Django的驾校在线考试系统
  16. WORD如何互相复制样式?
  17. 2021年电工(初级)实操考试视频及电工(初级)理论考试
  18. 使用CSS实现悬停显示二维码
  19. 如何做好测试用例的设计
  20. MapReduce自定义Job示例一:高温统计

热门文章

  1. 用友与华为结盟私有云 谁将是背后最大赢家?
  2. 2015年元旦百度新年大K站的情报汇总
  3. 如何使用android studio制作一个阿里云物联网APP
  4. UnicodeDecodeError: 'gb18030' codec can't decode byte 0xeb in position 7: incomplete multibyte seque
  5. Dev c++自带小游戏
  6. Windows的家谱
  7. 未知性与好奇心——使用技巧
  8. STM32+MCGS触摸屏四通道数据采集
  9. 请教关于Cisco ap1242的web配置
  10. JAVA/Python/PHP/go语言/区块链/大数据/人像修图等视频学习资料