【入门基础】java泛型和通配符详解

【入门基础】java泛型和通配符详解

文章目录

  • 前言
      • 泛型类
      • 泛型方法
      • 泛型接口
      • 通配符(Wildcards)
      • 使用场景
      • 非主流用法
  • 总结

前言

Java泛型(Generics)是JDK 5中引入的一个新特性,它提供了编译时类型安全检测机制,允许程序员在编译时检测到非法的类型。泛型的主要目的是在编译期间对类型进行检查,使得类型错误能在编译时而不是运行时被捕获,从而提高程序的稳定性和安全性。同时,它也消除了类型转换的代码,使得代码更加简洁和易于维护。

泛型类

泛型类是在类定义时,类名后面加上一对尖括号<>,尖括号中放置类型参数(type parameters)。例如:

java
复制代码
public class Box<T> {  private T t;  public void set(T t) { this.t = t; }  public T get() { return t; }  
}

这里的T就是一个类型参数,它指定了Box类内部将使用哪种类型的数据。在创建Box类的实例时,可以指定具体的类型,例如Box。

泛型方法

泛型方法不仅能在类级别定义类型参数,还能在方法级别定义。泛型方法允许在调用方法时指定类型参数。例如:

java
复制代码
public class Util {  public static <T> T getFirst(T[] inputArray) {  if (inputArray.length == 0) {  throw new IllegalArgumentException("Array is empty");  }  return inputArray[0];  }  
}

这里定义了一个类型参数T,它表示该方法将返回一个与数组类型相同的对象。

泛型接口

泛型接口与泛型类类似,接口名后面也可以定义类型参数。例如:

java
复制代码
public interface Pair<K, V> {  public K getKey();  public V getValue();  
}

这里<K, V>定义了两个类型参数K和V,分别代表键值对的键和值的类型。

通配符(Wildcards)

通配符?用于泛型中,表示未知的类型。它主要有三种用法:

  • 无界通配符(Unbounded Wildcards):使用?表示未知的类型,例如List<?>可以表示任何类型的List。
  • 上界通配符(Upper Bounded Wildcards):使用? extends T表示未知的类型,但它是T或T的子类。例如List<? extends Number>可以表示List或List等。
  • 下界通配符(Lower Bounded Wildcards):使用? super T表示未知的类型,但它是T或T的父类。例如List<? super Integer>可以表示List或List等。

使用场景

  • 无界通配符:常用于需要读取但不需要写入集合的场景,因为它保证了类型安全但限制了向集合添加元素。
  • 上界通配符:常用于需要从集合中读取元素的场景,并且你知道这些元素至少是某个类型的实例。
  • 下界通配符:常用于需要向集合中添加元素的场景,并且你添加的元素类型是这个集合中元素类型的父类型。

非主流用法

  • 泛型数组:虽然在Java中不能直接创建泛型数组(如T[] array = new T[10];是编译错误的),但可以通过反射(Array.newInstance)或泛型方法的类型参数来间接创建泛型数组。这种用法不常见,因为需要处理额外的复杂性和性能开销。
  • 泛型枚举:Java允许在枚举中使用泛型。虽然枚举通常用于表示一组固定的常量,但泛型枚举可以提供额外的灵活性,例如允许枚举值持有不同类型的对象。这种用法较为特殊,但在需要枚举与类型关联时非常有用。
  • 泛型异常:Java泛型不能用于throws子句中声明的异常类型,因为异常处理是在运行时进行的,而泛型信息在编译时就被擦除了。然而,可以通过泛型方法或泛型类来封装异常处理逻辑,以提供类型安全的异常处理。这种用法虽然不是直接对异常类型使用泛型,但实现了类似的效果。
  • 混合使用上下界通配符:
    虽然在实际编程中不常见,但可以混合使用上界(? extends T)和下界(? super T)通配符来创建复杂的类型约束。这种用法通常用于需要同时满足读取和写入操作,且对类型有严格要求的场景。然而,由于这种用法较为复杂且易出错,因此不是主流用法。
  • 在泛型类/接口声明中使用通配符:
    虽然在类/接口声明中直接使用通配符(如class MyClass<? extends T> {…})是不合法的,但可以在类/接口内部的方法或字段中使用通配符来提供额外的灵活性。这种用法虽然不常见,但在设计复杂的泛型API时可能会用到。
  • 利用通配符实现多态性:
    通配符提供了一种在泛型代码中实现多态性的方式。虽然这不是通配符独有的特性(泛型本身就是为了提供类型安全的多态性),但通配符的灵活性使得在某些情况下可以更加优雅地实现多态性。例如,使用List<?>作为方法参数可以接受任何类型的List,从而提供更大的灵活性。

总结

需要注意的是,上述非主流用法并非推荐的做法,它们可能增加代码的复杂性和出错的风险。在大多数情况下,应优先考虑使用泛型和通配符的主流用法来编写清晰、简洁、易于维护的代码。同时,随着Java语言的发展和新特性的引入,一些曾经看似非主流的用法可能会逐渐变得主流或过时。因此,建议始终关注Java语言的最新动态和最佳实践。在这里插入图片描述

我是杰叔叔,一名沪漂的码农,下期再会!

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【机器学习】Cross Validation: 强化模型泛化能力的利器

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 Cross Validation: 强化模型泛化能力的利器引言什么是Cross Validation&#xf…

Ubantu 使用 docker 配置 + 远程部署 + 远程开发

大家好我是苏麟 , Ubantu 一些配置 . 视频 : 服务器很贵&#xff1f;搞台虚拟机玩玩&#xff01;保姆级 Linux 远程开发教程_哔哩哔哩_bilibili Docker安装及配置 安装命令 : sudo apt install docker.io 查看版本号 : docker -v 查看虚拟机地址命令 : ifconfig 虚拟机地址 或…

pytorch的17个Loss和10个优化函数

pytorch的17个Loss和10个优化函数 一、 17个Loss 函数二、10个优化器 一、 17个Loss 函数 二、10个优化器 开始&#xff1a;

AI数字人+数字孪生IOC智慧运营平台:提升业务场景智慧化运维水平

在人工智能时代&#xff0c;“AI数字人数字孪生IOC智慧运营平台”&#xff0c;不仅能够提升数字孪生系统的人机交互体验&#xff0c;还能实现高效的运维管理&#xff0c;可以有效推动多领域场景数字化转型和智能化升级。 案例分享 深圳新一代产业园NEXT PARK交流中心 深圳新一…

coze.com收费了怎么办?这个方法让你继续免费使用!

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 另辟蹊径 📒📝 替代方案📝 测试⚓️ 相关链接 ⚓️📖 介绍 📖 突如其来的变化总是让人措手不及!那个曾经免费为我们提供无限便利的coze.com,竟然也悄然迈入了收费的行列。我们精心创建的Bot,那个每天陪伴我们工作、…

第十四届蓝桥杯省赛C++C组C题【三国游戏】题解(AC)

解题思路 由于三种国家都有获胜的可能&#xff0c;所以我们需要分别枚举 X , Y , Z X,Y,Z X,Y,Z 获胜的情况。 设 X X X 获胜&#xff0c;那么对于第 i i i 个事件的贡献为 a [ i ] − ( b [ i ] c [ i ] ) a[i]-(b[i]c[i]) a[i]−(b[i]c[i])&#xff0c;根据贪心的策略…

C++写一个线程池

C写一个线程池 文章目录 C写一个线程池设计思路测试数据的实现任务类的实现线程池类的实现线程池构造函数线程池入口函数队列中取任务添加任务函数线程池终止函数 源码 之前用C语言写了一个线程池&#xff0c;详情请见&#xff1a; C语言写一个线程池 这次换成C了&#xff01;…

object-C 解答算法:合并两个有序数组(leetCode-88)

合并两个有序数组(leetCode-88) 题目如下图:(也可以到leetCode上看完整题目,题号88) 首先搞懂,什么叫“非递减顺序” 非递减顺序,是指一个序列中的元素从前往后&#xff08;或从左到右&#xff09;保持不减少或相等。 这意味着序列中的元素可以保持相同的值&#xff0c;但不会…

网络云服务1

第一章 虚拟私有云 前言 在整个ICT基础设施的发展过程中&#xff0c;网络资源一直是必不可少的存在。有了网络资源&#xff0c;设备与设备间&#xff0c;系统与系统间才有了交流&#xff0c;才能更好地去支撑企业业务的快速发展。本章将带领大家了解华为云上的网络服务。 网…

四个节点即可实现的ComfyUI批量抠图工作流

原文链接&#xff1a;ComfyUI面部修复完全指南 (chinaz.com) 下图就是批量抠图的工作流 虽然工作流很简单&#xff0c;但是我们前提还是需要安装好我们的节点 首先安装我们的抠图节点 安装 BiRefNet 所需依赖&#xff1a;timm&#xff0c;如已安装无需运行 requirements.txt…

如何写好建模论文

如何写好建模论文 一、 写好数模答卷的重要性 1.评定参赛队的成绩好坏、高低&#xff0c;获奖级别&#xff0c; 数模答卷&#xff0c; 是唯一依据。 2.答卷是竞赛活动的成绩结晶的书面形式。 3.写好答卷的训练&#xff0c;是科技写作的一种基本训练。 二、 答卷的基本内容&…

【HTML入门】第十五课 - form表单(下)表单控件们(二)

上一小节我们说了文本输入框&#xff0c;密码输入框&#xff0c;数值型输入框&#xff0c;还有大的文本域。这一小节&#xff0c;我们继续说form表单中的一些常用的控件们。 目录 1 单选按钮 2 复选框 3 下拉列表选择 1 单选按钮 单选按钮&#xff0c;就是说一组按钮中&am…

R-CNN 中的区域建议网络

区域建议网络&#xff08;Region Proposal Network&#xff0c;RPN&#xff09;是R-CNN&#xff08;Regions with Convolutional Neural Networks&#xff09;架构中的一个关键组件&#xff0c;特别是在Faster R-CNN中。RPN的主要任务是生成可能包含物体的区域提议&#xff0c;…

buuctf-reverse write-ups (2)

文章目录 buu097-[SUCTF2019]hardcpp状态变量常量值与基本块的对应关系状态变量更新还原控制流程序修复进一步调试修复效果全局变量混淆去除 buu097-[SUCTF2019]hardcpp 这是一个简单的C程序&#xff0c;但带有大量的控制流平坦化混淆。下面我将从头开始编写用于解决此类混淆问…

FairGuard游戏加固入选《嘶吼2024网络安全产业图谱》

2024年7月16日&#xff0c;国内网络安全专业媒体——嘶吼安全产业研究院正式发布《嘶吼2024网络安全产业图谱》(以下简称“产业图谱”)。 本次发布的产业图谱&#xff0c;共涉及七大类别&#xff0c;127个细分领域。全面展现了网络安全产业的构成和重要组成部分&#xff0c;探…

react 快速入门思维导图

在掌握了react中一下的几个步骤和语法&#xff0c;基本上就可以熟练的使用react了。 1、组件的使用。react创建组件主要是类组件和函数式组件&#xff0c;类组件有生命周期&#xff0c;而函数式组件没有。 2、jsx语法。react主要使用jsx语法&#xff0c;需要使用babel和webpa…

二染色,CF 1594D - The Number of Imposters

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1594D - The Number of Imposters 二、解题报告 1、思路分析 并查集&…

uniapp封装请求拦截器,封装请求拦截和响应拦截的方法

首先我们先看一下uni官方给开发者提供的uni.request用来网络请求的api 1 2 3 4 5 6 7 8 9 uni.request({ url: , method: GET, data: {}, header: {}, success: res > {}, fail: () > {}, complete: () > {} }); 可以看到我们每次请求数据的时候都需…

通过MATLAB控制TI毫米波雷达的工作状态之TLV数据解析及绘制

前言 前一章博主介绍了如何基于设计视图中的这些组件结合MATLAB代码来实现TI毫米波雷达数据的实时采集。这一章将在此基础上实现TI毫米波雷达的TLV数据解析。过程中部分算法会涉及到一些简单的毫米波雷达相关算法,需要各位有一定的毫米波雷达基础。 TLV数据之协议解析 紧着…

el-cascader数据回显失败

el-cascader选中数据第一次回显正常&#xff0c;当选中数据改变再次回显时失败&#xff0c;呈现的还是上次的选中数据 如图 常用的方法this. n e x t T i c k ( ( ) > ) 跟 t h i s . nextTick(() > {})跟this. nextTick(()>)跟this.forceUpdate();强制刷新数据都无…