Java 泛型设计 -- Java 语言泛型的概述、类型擦出、协变与逆变

大家好,我是栗筝i,这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 011 篇文章,在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验,并希望进一步完善自己对整个 Java 技术体系来充实自己的技术栈的同学。与此同时,本专栏的所有文章,也都会准备充足的代码示例和完善的知识点梳理,因此也十分适合零基础的小白和要准备工作面试的同学学习。当然,我也会在必要的时候进行相关技术深度的技术解读,相信即使是拥有多年 Java 开发经验的从业者和大佬们也会有所收获并找到乐趣。

Java 泛型(Generics)是 Java 语言中一种强大的机制,允许类型(类和接口)以参数化的形式定义和使用。引入泛型的主要目的是提高代码的重用性、安全性和可读性。泛型在 Java SE 5 中引入,极大地增强了 Java 编程语言的表达能力。


文章目录

      • 1、泛型的基本概述
        • 1.1、泛型简介
        • 1.2、泛型的优势
      • 2、泛型的关键概念
        • 2.1、泛型类
        • 2.2、泛型接口
        • 2.3、泛型方法
          • 2.3.1、泛型方法的定义
          • 2.3.2、泛型方法的特性
          • 2.3.3、泛型方法的注意事项
        • 2.4、类型参数的命名约定
        • 2.5、泛型的实例化和类型推断
          • 2.5.1、泛型实例化
          • 2.5.2、类型推断
      • 3、泛型的限制
        • 3.1、不能实例化类型参数
        • 3.2、静态环境中的限制
        • 3.3、异常类不能是泛型
        • 3.4、数组和泛型的兼容性问题
      • 4、通配符和边界
        • 4.1、无界通配符(`?`)
          • 4.2、有界通配符(`? extends` 和 `? super`)
        • 4.3、通配符的使用场景和限制
      • 5、类型擦除
        • 5.1、什么是类型擦除以及为什么 Java 使用类型擦除
        • 5.2、类型擦除的影响
          • 5.2.1、丢失类型信息
          • 5.2.2、泛型数组的问题
          • 5.2.3、方法重载的限制
          • 5.3、如何处理类型擦除带来的限制
      • 6、泛型和反射
        • 6.1、使用反射访问泛型类型信息
        • 6.2、泛型数组的创建和类型转换
      • 7、最佳实践和设计模式
        • 7.1、泛型在设计模式中的应用
        • 7.2、避免泛型滥用的策略
          • 7.3、泛型代码的测试和调试
      • 8、协变、逆变与继承规则
        • 8.1、泛型的继承规则
        • 8.2、协变与逆变


1、泛型的基本概述

1.1、泛型简介

泛型(Generics)是在 JDK 5.0 版本中引入的一个新特性,泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。

在 JDK 5.0 引入泛型之前,Java 的集合框架并没有使用泛型,所有的集合类(如 ListSetMap 等)都是处理 Object 类型的对象。这意味

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/853296.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java的集合框架总结

Map接口和Collection接口是所有集合框架的父接口: Collection接口的子接口包括:Set接口和List接口 Map接口的实现类主要有:HashMap、TreeMap、Hashtable、ConcurrentHashMap以及Properties等 Set接口的实现类主要有:HashSet、Tr…

大数据实训项目(小麦种子)-03、大数据环境Hadoop、Mapreduce、Hive、Hbase、HDFS搭建服务及调试

文章目录 前言一、Linux系统Centos7安装配置JDK8二、Linxu系统Centos7中搭建Hadoop3.1.0服务下载地址服务1:详细步骤(初始化与启动dfs服务)详细步骤配置环境变量 服务2:Hadoop(YARN)环境搭建 三、Linux系统搭建Hive3.1.2服务前提条…

记录AE快捷键(持续补充中。。。)

记录AE快捷键 快捷键常用快捷键图层快捷键工具栏图层与属性常用指令视图菜单时间轴常规快捷键项目首选项功能摄像机操作 常用操作导入AI/PS工程文件加选一个关键参数快速回到上下一帧隐藏/显示图层关键帧拉长缩短关键帧按着鼠标左键不松手,在秒表那一列往下移动会都…

QT面试宝典:看你会了几道题?

目录 进程和线程的区别及其同步方式 堆栈的区别和使用场景 常用的排序算法及其时间与空间复杂度 数组和链表的区别和适用场景 回调函数的典型使用场景 static 和 const 关键字的区别和使用 元对象系统的作用和实现原理 信号与槽机制的优势和不足 QT事件机制的不同级别…

深度学习(PyTorch)批注理解,建议边学可以边看这个笔记

前言 动手学习深度学习,内容丰富,但是对于初学者有很多晦涩难懂的地方,我将日常更新这篇文章以截图的形式,每天高强度学习四五个小时,精力缺乏,我认为,如果想学习这个深度学习,你需…

ubuntu vnc

如何在Ubuntu 18.04安装VNC | myfreax sudo apt install xfce4 xfce4-goodies xorg dbus-x11 x11-xserver-utils sudo apt install tigervnc-standalone-server tigervnc-common vncserver sudo apt install xfce4 xfce4-goodies xorg dbus-x11 x11-xserver-utils sudo apt ins…

MFC序列号输入框

在MFC(Microsoft Foundation Classes)中创建一个对话框的过程,该对话框用于输入序列号(SN),并具有一些特定的行为,比如自动聚焦到输入框、验证输入规则以及根据输入情况关闭对话框。以下是步骤说…

Unity3D MMORPG多玩家状态同步详解

一、引言 在Unity3D开发的MMORPG(大型多人在线角色扮演游戏)中,多玩家状态同步是一个至关重要的技术环节。它确保了在大量玩家同时在线时,服务器和客户端之间能够保持状态的一致性,从而提供流畅且准确的游戏体验。本文…

5.数据仓库与数据挖掘期末复习

ETL的含义Extract 、 Transformation、Load。ODS的全称Operational Data Store。 DW全称 Data WarehourseDM全称是Data Mart数据仓库数据抽取时所用到技术是增量、全量、定时、调度STAGE层作用是提供业务系统数据文件的临时存储ODS层作用ods提供业务系统细节数据长期沉淀MID层…

实用软件下载:BetterZip 5最新安装包及详细安装教程

BetterZip是一款功能强大的Mac解/压缩软件,可以满足用户对文件压缩、解压、加密和保护等方面的需求。以下是关于BetterZip软件的主要功能、特点和使用方法的详细介绍,以及对其用户友好度、稳定性和安全性的评价。 安 装 包 获 取 地 址: BetterZip 5-安…

057、PyCharm 运行代码报错:Error Please select a valid Python interpreter

当我们在PyCharm运行代码时,提示如下图错误: 那么问题通常是由于PyCharm未正确配置Python解释器引起的。 我们只需按以下步骤重新配置Python解释器即可: 打开PyCharm设置: 在菜单栏中的点击 “File” -> “Settings”&#xf…

选择性语言建模:下一代语言模型训练方法

在人工智能领域,语言模型的预训练方法一直是研究的热点。传统的语言模型预训练方法普遍采用一种均匀的策略,即对所有训练数据中的下一个词进行预测,这种方法被称为因果语言建模(Causal Language Modeling, CLM)。虽然C…

Nginx配置详细解释:(6)实现反向代理服务器,动静分离,负载均衡

目录 单台反向代理 proxy_pass后面加不加/的问题: 反向代理动静分离 反向代理负载均衡 作为代理服务器是当客户端访问代理服务器时,代理服务器代理客户端去访问真实web服务器。proxy_pass; 用来设置将客户端请求转发给的后端服务器的主机。 需要模块…

Web前端弱势因素:深入探讨与挑战解析

Web前端弱势因素:深入探讨与挑战解析 在快速发展的Web前端领域,尽管技术日新月异,但仍存在一些固有的弱势因素。这些因素不仅影响了开发效率和用户体验,也带来了诸多挑战。本文将深入探讨Web前端的弱势因素,并从四个方…

【C++11 之rbegin()、rend() 反向迭代器原理介绍及 重点-限制情况】与正向迭代器对比(互换放在下一p)

C11 引入了许多新特性,其中包括对 STL(Standard Template Library)的改进。在 STL 容器中,rbegin() 和 rend() 是两个新的成员函数,它们分别返回指向容器最后一个元素的反向迭代器(reverse iterator&#x…

你不知道的HTML5应用程序缓存:深度揭秘与进阶实践

在HTML5的众多革新之中,应用程序缓存(AppCache)常常被视为一项被忽视的宝藏。尽管近年来Service Workers逐渐取代了它的位置,AppCache在特定场景下仍展现了其独特的魅力与价值。本文旨在深入挖掘HTML5应用程序缓存的隐藏功能、常见…

Android入门第69天-AndroidStudio中的Gradle使用国内镜像最强教程

背景 AndroidStudio默认连接的是dl.google的gadle仓库。 每次重新build时: 下载速度慢;等待了半天总时build faild;build到一半connection timeout;即使使用了魔法也难以一次build好;这严重影响了我们的学习、开发效率。 当前网络上的使用国内镜像的教程不全 网上的教程…

C++ shared_ptr

shared_ptr共享它指向的对象,多个shared_ptr可以指向(关联)相同的对象,在内部采用计数机制来实现。 当新的shared_ptr与对象关联时,引用计数增加1。 当shared_ptr超出作用域时,引用计数减1。当引用计数变为…

YOLOv8改进 | 注意力机制 | 添加适用于遥感图像的LSKblock注意力——【二次创新+完整代码】

💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 遥感目标检测的研究主要集中在改进方向边界框的表示上,而忽略了遥感场景中独特的先验知识。 这类先验知识对于准确检测微小目标至关重要,因为这些目标往往需要更大的上下文信息才能被正确识别。提出的 LSKNet …

根据身份证获取生日、性别、年龄

当type1时获取出生日期,type2时获取性别,type3时获取年龄 /** 当type1时获取出生日期,type2时获取性别,type3时获取年龄* */ function IdCard(IdCard, type) {if (type 1) {//获取出生日期let birthday IdCard.substring(6, 10) "-" IdCard.substring(10, 12) …