当前位置:网站首页 > Java基础 > 正文

java基础247讲解



提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、案例分析
    • 1.1 传统方式
    • 1.2 使用泛型
  • 二、泛型
    • 2.1 概念
    • 2.2 语法
      • 2.2.1 声明
      • 2.2.2 实例化
    • 2.3 细节
    • 2.4 自定义泛型类
    • 2.5自定义泛型接口
    • 2.6 自定义泛型方法
    • 2.7 泛型通配符
  • 三、拓展 - 泛型擦除


前言

本篇文章主要讲述JavaSE知识体系中的泛型部分的内容。


一、案例分析

为了引出泛型的使用,我们先给出一个简单的小案例,并使用传统的方式(无泛型)实现。案例如下:请使用ArrayList来存储三个Dog对象的信息,每个Dog对象包含两个属性:姓名name、年龄age,存储完毕进行遍历输出。

1.1 传统方式

先定义一个Dog类:

 

现在我们使用ArrayList来存储Dog对象并输出(不使用泛型):

 

分析代码,可以看到上述代码最直观的问题:

  1. :每次从容器中取出对象都需要进行一个向下转型的处理,一是比较麻烦,二是当容器中数据量比较大时会影响到程序执行的效率。
  2. :因为Object类是所有Java类的父类,那么可以向容器中加入任意类的对象。现我们创建Person类如下:
 

Person类的属性为:姓名name、地址address。现在我们往容器中加入Person类的对象:

 

可以看到编译器没有出现任何错误提示:
在这里插入图片描述
现在运行程序,发现控制台输出异常信息ÿjava基础247讲解1a;
在这里插入图片描述
使用传统方式无法对加入容器中的数据类型进行。

1.2 使用泛型

话不多说,先来一波泛型的快速体验。使用泛型创建容器的代码为:

 

当我们想再往dogList 中添加Person类的对象时,编译器会出现错误提示且程序无法编译通过:
在这里插入图片描述
因为已经使用了泛型约束了容器dogList 只能存储Dog类的对象,所以遍历处理时也无需再进行向下转型处理:

 

在这里插入图片描述

二、泛型

2.1 概念

2.2 语法

2.2.1 声明

在接口/类中声明泛型的方式为:

其中,字母T、K、V不代表值,而,字母的形式可以任意,一般常用T(Type)、K(Key)、V(value)等容易理解的形式。示例如下:

 
 

2.2.2 实例化

泛型声明以后,使用时需要在接口/类名后面指定类型参数的值(类型)。示例如下:

 

2.3 细节

1.public class Customer<K,V> 中的K、V。如下所示:

在这里插入图片描述
2. 在指定具体的泛型类型之后,可传入。示例如下:

 
 
 

我们约束容器animals 的数据类型为Animal类型,但是当我们传入Cat类的实例对象时,编译器也不会出现编译错误。

3.当没有指定具体泛型类型时,(参见案例部分)。

2.4 自定义泛型类

自定义泛型类的语法形式如下:

 

现自定义泛型类Person类如下:

 

使用自定义泛型类的注意事项如下:

1.普通成员可以使用泛型(属性、方法等)。示例如下:

 

2.使用泛型的数组,不能进行初始化(后文将会在章节中说明为什么不能初始化)。示例如下:
在这里插入图片描述
3.静态成员(属性、方法)不能使用泛型,示例如下:
在这里插入图片描述
4.泛型类的类型是在创建对象实例时确定的。
5.如果在创建对象时,没有指定泛型的类型,则默认为Object。

2.5自定义泛型接口

自定义泛型接口的基本语法格式为:

 

使用自定义泛型接口的注意事项如下:

 
 
 

3.同理,若没有指定类型则默认为Object。

2.6 自定义泛型方法

自定义泛型方法的语法格式为:

 
 

在方法调用时可确定泛型类型:

 

在这里插入图片描述
2.在中同样可使用自定义泛型方法,自定义泛型方法的泛型符号可以是自定义的,也可以使用泛型类的泛型符号。示例如下:

 

调用如下:

 

在这里插入图片描述

2.7 泛型通配符

Java中的泛型通配符提供了一种更为灵活的方式来处理泛型。泛型通配符主要有3种形式:

  • 无界通配符:使用符号表示,表示可以接收任意类型。示例如下:
 

在这里插入图片描述

  • 上界通配符:使用表示,表示可以是Type类型或者其子类类型。示例如下:
 
 
 
 

在这里插入图片描述

  • 下界通配符:使用表示,表示可以是Type类型或者其父类类型。示例如下:
 

三、拓展 - 泛型擦除

Java中的泛型擦除是指Java编译器在将泛型类型参数从代码中(即擦除),并将其替换为原始类型或它们的上界(若未指定上界则为Object类型),即泛型信息在编译为字节码之后就了,实际的类型都当做Object类型来处理。编写示例代码如下:

 

查看字节码如下所示(IDEA可安装ASM Bytecode Outline插件):
在这里插入图片描述

  • list.add(6)实际调用的是:当做Object类型存储。
  • list.get(0)实际调用的是:取出为Object类型,但是做了一个强制类型转换,把Object类型转为Integer类型。
  • JVM指令checkcast:用于执行的检查。该指令确保对象引用可以安全地从一种类型转换为另一种类型。如果在运行时无法执行该转换,则 checkcast 指令会抛出 ClassCastException。

版权声明


相关文章:

  • 尚硅谷java基础试题2024-10-22 08:10:01
  • java三大平台的基础平台2024-10-22 08:10:01
  • 础深入解析java基础2024-10-22 08:10:01
  • java语法基础129讲解2024-10-22 08:10:01
  • java最基础游戏代码2024-10-22 08:10:01
  • Java基础应用心得2024-10-22 08:10:01
  • c 基础 java入门视频教程2024-10-22 08:10:01
  • java基础写的小程序2024-10-22 08:10:01
  • java三层架构基础2024-10-22 08:10:01
  • java做游戏零基础2024-10-22 08:10:01