资讯专栏INFORMATION COLUMN

简单介绍-泛型和包装类【数据结构】

GitChat / 2889人阅读

摘要:泛型什么是泛型背景为了能够写一个类一个方法,就能够同时支持多种不同类型的对象所谓的泛型,就是从语法层面对进行了一个简单的包装,编译过程可以帮我们自动加上一些编译期的类型检查,自动帮我们完成一些类型转换工作举例就是一个泛型的

泛型

什么是泛型?

背景:为了能够写一个类 / 一个方法,就能够同时支持多种不同类型的对象

所谓的泛型,就是从语法层面对 Object 进行了一个简单的包装,编译过程可以帮我们自动加上一些编译期的类型检查,自动帮我们完成一些类型转换工作

举例:

ArrayList 就是一个泛型的实例,可以聚集任何类型的对象

使用 Object,因为在 Java 中,Object 是所有子类直接 / 间接继承的父类

public class ArrayListTest {    private Object[] data;}
public class ArrayListTest {    private Object[] data;    private Object[] data = new Object[20];	private int size;	public void add(Object elem){   		data[size] = elem;    	size++;	}	public Object get(int index){    	return data[index];	}}

上述代码在运用时,会出现问题,例:


String 继承 Object,
在调用 add 时,相当于向上转型,发生隐式类型转换
调用 get 时,返回 Object,但此时赋值给 String,此处为向下转型

可以使用泛型解决上述问题:

public class ArrayListTest<E> {//当前这个 data 的类型,可以就当成一个 Object[ ]//Object 具体代表的是哪种类型 需要最终在实例化 ArrayListTest 时,才能确定    private E[] data = (E[])new Object[20];    private int size;    public void add(E elem){        data[size] = elem;        size++;    }    public E get(int index){        return data[index];    }    public static void main(String[] args) {        ArrayListTest<String> test = new ArrayListTest<>();        test.add("Java");        test.add("Cpp");        String s = test.get(0);    }}

泛型编程,类似于一个"模板"

泛型参数只能是 引用类型



此时,再调用 add,就会发现,已经是 String 类型了

再例如
自己写一个 Animal 类:

public class Animal {    private String name;}
public class ArrayListTest<E> {    private E[] data = (E[])new Object[20];    private int size;    public void add(E elem){        data[size] = elem;        size++;    }    public E get(int index){        return data[index];    }    public static void main(String[] args) {		ArrayListTest<Animal> animals = new ArrayListTest<>();        animals.add(new Animal());        Animal animal = animals.get(0);    }}

animals 调用 add 方法时,就会发现类型是 Animal


类型参数可以给编译器提供了很好的有效信息,当调用方法时,不需要进行强制类型转换,编译器就知道返回类型

泛型这样的语法是一种编译期的机制,为了方便程序猿书写代码,以及编译过程进行一些类型检查,编译完成了之后,在运行过程中,是没有泛型的
编译代码过程中,直接把泛型参数当成了 Object,只不过编译器自动加上了一些类型转换操作,以及类型校验操作

包装类

思考:如果是 int,double,等基础类型,如何套用泛型?

以 int 为例: 创建一个类,用这个类来表示一个整数
(标准库已经帮我们创建好了对应的类,就成为包装类)

包装类,就是把 8 种基础类型,用一个类稍微包装了一下,变成了引用类型

基本数据类型与其对应的包装类

基本数据类型包装类
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean
public static void main(String[] args) {    ArrayListTest<Integer> list = new ArrayListTest<>();	list.add(new Integer(66));}

装箱(boxing):

将内置类型转换为包装类,称为装箱

手动装箱:

public static void main(String[] args) {    ArrayListTest<Integer> list = new ArrayListTest<>();    //把 int 转换成 Integer    //1.	Integer num1 = new Integer(66);  //装箱	list.add(num1);	//2.	Integer num2 = Integer.valueOf(88);	list.add(num2);}

自动装箱:

编译器赋予包装类的特殊功能

Integer num3 = 10;

valueOf 是 Integer 类里的一个静态方法,通过 类名.方法名,即可调用

拆箱(unboxing):

手动拆箱:

Integer num = 10;//拆箱num = list.get(0);int value2 = num.intValue();

自动拆箱:

Integer num = 10;int value = num;

所谓的 装 / 拆箱,就是类型转换
所谓的 自动拆 / 装箱,就是隐式类型转换

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/121243.html

相关文章

  • Java型和型擦除

    摘要:对每个泛型类只生成唯一的一份目标代码该泛型类的所有实例都映射到这份目标代码上,在需要的时候执行类型检查和类型转换。参考文章的模板是典型的实现,而泛型则是实现,将多种泛型类形实例映射到唯一的字节码表示是通过类型擦除实现的。 一 前言:初识泛型 废话不说,先来看一段代码: public class Holder { private Object data; pub...

    el09xccxy 评论0 收藏0
  • Java型和型擦除

    摘要:对每个泛型类只生成唯一的一份目标代码该泛型类的所有实例都映射到这份目标代码上,在需要的时候执行类型检查和类型转换。参考文章的模板是典型的实现,而泛型则是实现,将多种泛型类形实例映射到唯一的字节码表示是通过类型擦除实现的。 一 前言:初识泛型 废话不说,先来看一段代码: public class Holder { private Object data; pub...

    StonePanda 评论0 收藏0
  • Java 高效编程(Effective Java)中文第三版

    摘要:来源前条来源一书英文版已经出版,这本书的第二版想必很多人都读过,号称四大名著之一,不过第二版年出版,到现在已经将近年的时间,但随着,,,甚至的发布,语言发生了深刻的变化。译者在这里第一时间翻译成中文版。供大家学习分享之用。 来源:sjsdfg/effective-java-3rd-chinese前 51 条来源:Effective Java, Third Edition 《Effec...

    ysl_unh 评论0 收藏0
  • 《Java编程思想》--持有对象--型和型安全的容器

    摘要:层次结构如上所示,的子类都可以作为集合的元素加入到集合中,并且不会有任何影响。在实际编码中一般都建议使用类型安全的容器,这样不容易出错,出错也会在编译期间就会展现出来。 概述 说起类型安全的容器,那么什么是类型不安全的容器呢?容器用来存储数据,常见的存储数据的容器有数组和集合,数组有以下特点: 长度固定 只能存储同一种类型的数据 因为数组只能存储同一种数据类型的数据,那么它就是类型...

    nemo 评论0 收藏0
  • 【Java数据结构】初识集合框架——List的使用(附加自动发牌案例)

    【Java数据结构】初识集合框架——List的使用(附加自动发牌案例) 泛型什么是泛型泛型的分类泛型的定义简单演示泛型背后作用时期和背后的简单原理泛型类的使用泛型总结 包装类基本数据类型和包装类直接的对应关系包装类的使用,装箱(boxing)和拆箱(unboxing) List的使用List常用方法使用示例 自动发牌案例 泛型 什么是泛型 泛型: 即通过参数化类型来实现在同一份代码上操作多种...

    oogh 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<