首页 > 编程语言 >java核心-泛型

java核心-泛型

时间:2024-07-08 13:27:17浏览次数:15  
标签:java 核心 通配符 类型 擦除 泛型 参数 方法

目录

概述

   了解泛型有利于学习 jdk 、中间件的源码,提升代码抽象能力,封装通用性更强的组件。

什么是泛型

  • 在定义类、接口和方法时,可以在声明时通过一定的格式指定其参数类型
  • 使用时再指定具体的类型,从而使用类、接口和方法可以被多种类型的数据所实例化和调用
  • 这种可以在编译时进行参数类型检查的技术被称为泛型,是 jdk 5 中引用的一个新特性
  • 本质是 参数化类型,给类型指定一个参数,在使用时再指定参数具体的值,那这个 类型可以在使用时决定
  • 优点
    • 将运行时的错误,提前到编译时,这样可以在编译时将错误提示出来,避免了运行时出现错误
    • 使用泛型可以提高代码的复用性,因为它可以支持多种类型的数据
    • 减少了源代码中的强制类型转换、代码更加可读

分类

  • 可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法
  • 泛型字母通常类型参数都使用大写的单个字母
    • T:任意类型 type
    • E:集合中元素的类型 element
    • K:key-value 形式 key
    • V:key-value 形式 value

泛型类

  • 泛型类
    • 泛型类型必须是引用类型,即类类型 (不能使用基本数据类型)
    • 在类名后添加一对尖括号,并在尖括号中填写类型参数
    • 如果参数可以有多个,多个参数使用逗号分隔
public class 类名<泛型1,...>{
	private 泛型类型 变量名
	
	public 泛型类型 方法名(){};
	
	public 返回值 方法名(泛型类型 t) {}
}

注意

  • 泛型类创建的使用没有指定类型,则默认是object类型
  • 泛型类型从逻辑上看是多个类型,实际都是相同类型
  • java 可以创建对应的泛型对象和泛型数组引用,但不能直接创建泛型对象和泛型数组
    • java有类型擦除,任何泛型类型在擦除之后就变成了 Object 类型
    • 因此创建泛型对象就相当于创建了一个 Object 类型的对象
    • 所以直接创建泛型对象和泛型数组的行为被编译器禁止

泛型接口

注意

  • 泛型知识点
    • 如果泛型类的子类也是泛型类,那父类和子类的类型要一致
    • 如果子类泛型有多个,那需要包括父类的泛型类型
class Child <T,E,E> extends Parent<T> {
}

泛型接口 接口名称 <泛型类型1,...>{
}

泛型方法

泛型方法

  • 调用方法的时候指定泛型的具体类型
  • 格式如下
    修饰符 <T,E,...> 返回值类型 方法名(){
    }
    
  • 修饰符和返回值中间有 <T,E,...> 才是泛型方法 泛型类里的普通返回值类型不是泛型方法
    在这里插入图片描述
  • 注意
    • 泛型类的类型和泛型方法的类型是互相独立的,同名也不影响
    • 声明了 泛型方法 在参数列表和方法体里面才可以用对应的泛型
      在这里插入图片描述
  • 使用了类泛型的成员方法,不能定义为静态方法;使用了泛型方法的才可以定义为静态方法
    在这里插入图片描述
  • 可变参数的泛型方法
    在这里插入图片描述

泛型通配符

  • java 泛型的通配符是用于解决泛型之间引用传递问题的特殊语法
// 表示类型参数可以是任何类型
public class CustomCollection<?>{}

// 表示类型参数必须是A或者是A的子类
public class CustomCollection<T extends A>{}

// 表示类型参数必须是A或者是A的超类型
public class CustomCollection<T supers A>{}

分类

  • 通用类型通配符 <?> 如 List<?>
    • 主要作用就是让泛型能够接受未知类型的数据
    • 可以将 ? 看成所有泛型类型的父类,是一种真实的类型,类型通配符是实参,不是形参
  • 固定上边界的通配符采用 <? extends E> 的形式
    • 使用固定上边界的通配符的泛型,只能够接受指定类型及其子类类型的数据
    • 采用<? extends E> 的形式,这里的E就是该泛型的上边界
    • 注意:虽然使用 extends 关键字,却不仅限于继承了父类E的子类 ,也可以代指实现了接口的 E 的类
  • 固定下边界的通配符,采用 <? super E> 的形式
    • 使用固定下边界的通配符的泛型,只能够接受指定类及其父类类型的数据
    • 采用<? super E> 的形式,这里的 E 就是该泛型的下边界
    • 可以为一个泛型指定上边界或下边界,但是不能同时指定上下边界

泛型类型擦除

   泛型是 jdk 1.5 后出现的,但泛型代码和常规版本代码可以兼容,主要原因是泛型信息是在代码编译阶段,代码编译完成后进入 jvm 运行前,相关的泛型类型信息会被删除,这个即 泛型类型擦除
   作用范围:类泛型、接口泛型、方法 泛型

分类

无限制类型擦除

擦除后都是 Object,没指定类型则擦除后是 Object 最顶级父类
在这里插入图片描述

有限制类型擦除

在这里插入图片描述

问题

如何解决创建 泛型数组和获取全部数组

需求

创建一个类里面支持泛型数组和返回全部数组的方法

第一种

  可以通过返回下的 Array.newInstance 创建泛型数组,自动生成指定的类型字节码即可,使用可以创建实际类型的数组

在这里插入图片描述

第二种

jdk源码 ArrayList中的实现

标签:java,核心,通配符,类型,擦除,泛型,参数,方法
From: https://blog.csdn.net/2301_79691134/article/details/140244107

相关文章

  • JAVA设计模式>>单例模式
    本文介绍23中设计模式中的单例模式         这篇文章详解四个知识点:单例模式的概念,单例设计模式八种方式,单例模式在JDK应用的源码分析,单例模式注意事项和细节说明单例设计模式1.1概述        所谓类的单例设计模式,就是采取一定的方法保证在整个的软......
  • 基于SSM的学校运动会信息管理系统(有报告)。Javaee项目。ssm项目。
    演示视频:基于SSM的学校运动会信息管理系统(有报告)。Javaee项目。ssm项目。项目介绍:采用M(model)V(view)C(controller)三层体系结构,通过Spring+SpringMvc+Mybatis+Jsp+Maven来实现。MySQL数据库作为系统数据储存平台,实现了基于B/S结构的Web系统。报告截图:......
  • JAVA——异常
    异常Exception概念异常也就是非正常情况,比如使用空的引用、数组下标越界、内存溢出错误等,这些都是意外的情况,背离我们程序本身的意图。Java提供了异常对象描述这类异常情况。Java提供了异常机制来进行处理,通过异常机制来处理程序运行期间出现的错误。通过异常机制,可以更好......
  • Java——面试题
    1、JDK和JRE有什么区别?JDK(JavaDevelopmentKit),Java开发工具包JRE(JavaRuntimeEnvironment),Java运行环境JDK中包含JRE,JDK中有一个名为jre的目录,里面包含两个文件夹bin和lib,bin就是JVM,lib就是JVM工作所需要的类库。2、==和equals的区别是什么?对于基本类型,==比较的......
  • 从零开始学Java(超详细韩顺平老师笔记梳理)03——各类运算符、标识符关键字、进制转换、
    文章目录前言一、运算符(算术、关系、逻辑、赋值、三元)1.算术运算符2.关系运算符(比较运算符)3.逻辑运算符4.赋值运算符5.三元运算符TernaryOperator二、运算符优先级三、标识符规范与关键字1.标识符命名规则和规范2.关键字3.保留字四、键盘输入五、进制介绍转换,......
  • doc转docx(java-python)
    本文功能借助python实现的doc转docx,调研了一下开源的工具或者类库转换效果不理想,所以选择python 1./resources/convert.py(py文件放到resources下)importargparsefromdoc2docximportconvertdefconvert_doc_to_docx(docFilePath,docxFilePath):convert(docFi......
  • Java核心技术学习笔记(四)
    一、Java有几种文件拷贝方式Java有多种比较典型的文件拷贝实现方式,比如:利用java.io类库,直接为源文件构建一个FileInputStream读取,然后再为目标文件构建一个FileOutputStream,完成写入工作。publicsaticvoidcopyFileByStream(Filesource,Filedes)throwsIOException{......
  • java-spring boot光速入门教程(超详细!!)
    目录一、引言1.1初始化配置1.2整合第三方框架1.3后期维护1.4部署工程1.5敏捷式开发二、SpringBoot介绍springboot2.1搭建一个springboot工程2.2使用idea创建项目2.3在线创建姿势2.4项目的目录结构2.5项目的运行方式2.6yml文件格式2.7多环境配置2......
  • Java笔试|面试 —— 对多态性的理解
    谈谈对多态性的理解:一个事物的多种形态(编译和运行时状态不一致性)实现机制:通过继承、重写和向上转型(Objectobj=new子类())来实现。1.广义上的理解子类对象的多态性,方法的重写;方法的重载;子类对象的多态性:编译时是父类对象,运行时是不确定的子类对象。(体现不一致性)......
  • Java核心技术学习笔记(三)
    一、谈谈Java反射机制,动态代理是基于什么原理?反射机制是Java语言提供的一种基础功能,赋予程序在运行时自省(introspect,官方用语)的能力。通过反射我们可以直接操作类或者对象,比如获取某个对象的类定义,获取类声明的属性和方法,调用方法或者构造对象,甚至可以运行时修改类定义。动态代......