【系列】重新认识Java——泛型(基础、使用和实现原理)

泛型是Java中重要知识点,是必须要深刻掌握的内容。由于泛型相关的内容比较多,基于单一知识原则,笔者打算将泛型部分分开成两部分书写。本文主要的内容如下:

  1. 泛型基础概念
  2. 泛型的分类、定义和使用
  3. Java泛型的实现原理

泛型基础内容

泛型是Java中一个非常重要的内容,对于Java进阶学习是必须要掌握的知识点。

解决的问题

在开始介绍泛型的知识之前,先来了解一下泛型解决了什么问题,换句话说,为什么需要使用泛型。集合类是在开发过程中经常要用的类,下面是不使用泛型的代码示例。

// 定义一个List,add()可以存放Object及其子类实例
List list = new ArrayList();
list.add(123); // 合法
list.add("123"); // 合法

// 我们在编译时无法知晓list到底存放的什么数据,于是在进行强制转换时发生异常
int i = (Integer) list.get(1); // 抛出ClassCastException异常

上面的代码首先实例化一个ArrayList对象,它可以存放所有Object及其子类实例。分别add一个Integer类型对象和String类型对象,我们原本以为list中存放的全部是Integer类型对象,于是在使用get()方法获取对象后进行强制转换。从代码中可以看到,索引值为1的位置放置的String类型,很显然在进行强制转换时会抛出ClassCastException(类型转换异常)。由于这种异常只会发生在运行时,我们在开发时稍有不慎,就会直接掉到坑里,还很难排查出问题。

为什么会出现这种问题呢?

  1. 集合本身无法对其存放的对象类型进行限定,可以涵盖Java中的所有类型。缺口太大,导致各种蛇、蚁、虫、鼠通通都可以进来。
  2. 由于我们要使用的实际存放类型的方法,所以不可避免地要进行类型转换。小对象转大对象很容易,大对象转小对象则有很大的风险,因为在编译时,我们无从得知对象真正的类型。

泛型就是为了解决这类问题而诞生的。

泛型中的基本概念

泛型,即参数化类型,是在JDK1.5之后才开始引入的。所谓参数化类型,是指所操作的数据类型在定义是被指定为一个参数,然后在使用时传入具体的类型。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口和泛型方法。还是以上一节的示例为例,下面是其泛型写法。

List<Integer> list = new ArrayList<Integer>();
list.add(123); // 合法
list.add("123"); // 不合法,编译不通过

int i = list.get(1); // 无需强制转换类型

在第1行代码中已经限定了List中仅可存放Integer类型对象,所以在第3行add一个String类型对象时,IDE会报错,并且无法编译通过。我们来看看JDK1.5之后的List接口定义如下:

public interface List<E> extends Collection<E> {
   

    boolean add(E e);

    E get(int index);
}

上面的尖括号中的E就是泛型的类型参数(或者称之为形参),而在调用List类时,传入了Integer这个具体的类型参数(或者称为实参)。下面详细介绍一下泛型中一些基本术语(以List为例):

  • List称为泛型类型
  • List中的E称为类型变量或者类型参数
  • List称为参数化的类型
  • List中的Integer称为类型参数的实例或者实际类型参数
  • List中的念为typeof Integer
  • List称为List的原始类型

泛型的定义和使用

泛型的参数类型可以定义类、接口和方法中,分别称为泛型类、泛型接口和泛型方法。

泛型类的定义和使用

一个泛型类(generic class)就是具有一个或多个类型变量的类。上面的例子中的List就是一个典型的泛型类。泛型类的定义结构类似下面的代码:

  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值