【入门基础】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://www.mzph.cn/bicheng/48134.shtml

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

相关文章

socket 收发TCP/UDP

一、c 个人测试记录&#xff0c;有问题还请指出&#xff0c;谢谢 参考&#xff1a;C开发基础之网络编程WinSock库使用详解TCP/UDP Socket开发_c udp使用什么库-CSDN博客 代码中Logger测试见文章&#xff1a; c中spdlog的使用/python中logger的使用-CSDN博客 1、main.cpp 收…

【体外诊断】ARM/X86+FPGA嵌入式计算机在医疗CT机中的应用

体外诊断 信迈科技提供基于Intel平台、AMD平台、NXP平台的核心板、2.5寸主板、Mini-ITX主板、4寸主板、PICO-ITX主板&#xff0c;以及嵌入式准系统等计算机硬件。产品支持GAHDMI等独立双显&#xff0c;提供丰富串口、USB、GPIO、PCIe扩展接口等I/O接口&#xff0c;扩展性强&…

前端组件化开发:以Vue自定义底部操作栏组件为例

摘要 随着前端技术的不断演进&#xff0c;组件化开发逐渐成为提升前端开发效率和代码可维护性的关键手段。本文将通过介绍一款Vue自定义的底部操作栏组件&#xff0c;探讨前端组件化开发的重要性、实践过程及其带来的优势。 一、引言 随着Web应用的日益复杂&#xff0c;传统的…

通义千问AI模型对接飞书机器人-模型配置(2-1)

一 背景 根据业务或者使用场景搭建自定义的智能ai模型机器人&#xff0c;可以较少我们人工回答的沟通成本&#xff0c;而且可以更加便捷的了解业务需求给出大家设定的业务范围的回答&#xff0c;目前基于阿里云的通义千问模型研究。 二 模型研究 参考阿里云帮助文档&#xf…

CSRF+XSS组合攻击实战

目录 0x01安装靶场 0x02分析功能点的请求接口&#xff0c;构造恶意请求 0x03寻找xss漏洞 0x01安装靶场 下载源码&#xff0c;解压到网站根目录 1.修改数据库配置文件 打开源码&#xff0c;进入到include目录下&#xff0c;打开数据库配置文件database.inc.php 将数据库的…

组内第一次会议

会议内容 1、科研平台使用 增删改查对文件 cp -r /root/mmdetection/dataset/ /root/user/wbzExperiment/mmdetection/ rm -r /root/user/yolov5-master tar -czvf test03.tar.gz test03/ unzip abc.zip 上传文件、解压文件&#xff1a;要在自己的目录中&#xff0c;进入…

Python函数基础:构建代码逻辑的基石(补全篇)

在前面我已经编写过一篇&#xff0c;python函数基础的博文&#xff0c;相信有基础的同学应该看得出来&#xff0c;那一篇的基础内容也是不全的&#xff0c;于是就有了这个补全篇。补全篇&#xff0c;补充了变量的作用与&#xff08;global与nonlocal&#xff09;、递归函数、闭…

acwing796-子矩阵的和-前缀和

s矩阵是全局变量&#xff0c;维度n*m,从1~n和 1~m存储元素【0】【0】~【0】【m】和【0】【0】~【n】【0】分别存储的都是0.s矩阵刚开始是存储输入的元素&#xff0c;后面用于存储前缀和。 s矩阵的意思是s【i】【j】表示从【0】【0】到【i】【j】为对角线的矩阵里面所有元素的和…

多类别支持向量机(Multi-class SVM)

多类别支持向量机&#xff08;Multi-class SVM&#xff09;是一种扩展二分类支持向量机以处理多类别分类问题的方法。常见的方法有“一对一”&#xff08;one-vs-one&#xff09;和“一对多”&#xff08;one-vs-rest&#xff09;。 一、数学模型理论推导 1.1 一对多&#xf…

新的铸造厂通过 PROFIBUS 技术实现完全自动化

钢铁生产商某钢以其在厚钢板类别中极高的产品质量而闻名。其原材料&#xff08;板坯连铸机&#xff09;在钢铁厂本地生产&#xff0c;该厂最近新建了一座垂直连铸厂。该项目的一个主要目标是从一开始就完全自动化这座新工厂和整个铸造过程&#xff0c;以高成本效率实现最佳产品…

用AI对抗AI:Fortinet解锁家电制造网络安全新密码

Fortinet盛大启幕《构筑垂直行业 网络安全防线》系列研讨会。首场研讨会聚焦于家电制造领域&#xff0c;以《利用AI打造家电制造网络安全的新质力》为主题。 Fortinet中国南区资深安全顾问黄志攀深入洞察家电制造行业的网络安全挑战&#xff0c;全面解析了Fortinet如何通过全栈…

数据库系统概论:数据库系统的锁机制

引言 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;数据作为一种共享资源&#xff0c;其并发访问的一致性和有效性是数据库必须解决的问题。锁机制通过对数据库中的数据对象&#xff08;如表、行等&#xff09;进行加锁&#xff0c;以确保在同…

基于python的去除图像内部填充

1 代码功能 该代码实现了一个图像处理的功能&#xff0c;具体来说是去除图像内部填充&#xff08;或更准确地说&#xff0c;是提取并显示图像中轮廓的外围区域&#xff0c;而忽略内部填充&#xff09;。以下是该功能的详细步骤&#xff1a; 读取图像&#xff1a;使用cv2.imread…

AWS服务器购买:如何选择合适的AWS云服务器

在当今数字化时代,云计算已成为企业IT基础设施的重要组成部分。作为全球领先的云服务提供商之一,亚马逊网络服务(AWS)提供了丰富多样的云服务器选项。然而,面对众多选择,如何为您的业务需求挑选最合适的AWS云服务器呢?我们结合九河云的分析来给你解答。 1. 明确业务需求 首先…

JVM调优:根据JVM自带工具定位问题(jps、jstat、Visual VM的使用)

JVM调优步骤 发现问题、定位问题、解决问题 发现问题 常见问题如下 GC频繁CPU负载过高内存溢出&#xff08;OOM&#xff09;内存泄露死锁程序响应时间较长 用JDK自带命令调优工具定位问题 jps&#xff08;java process status&#xff09;:查看正在运行的Java进程 基本语…

JUnit 单元测试

JUnit 测试是程序员测试&#xff0c;就是白盒测试&#xff0c;可以让程序员知道被测试的软件如何 &#xff08;How&#xff09;完成功能和完成什么样&#xff08;What&#xff09;的功能。 下载junit-4.12和hamcrest-core-1.3依赖包 相关链接 junit-4.12&#xff1a;Central …

html+canvas 实现签名功能-手机触摸

手机上的效果图 需要注意&#xff0c;手机触摸和鼠标不是一个事件&#xff0c;不能通用&#xff0c;上一篇是关于使用鼠标的样例 相关代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewpo…

什么是AQS(抽象队列同步器)?

AQS是AbstractQueuedSynchronizer的简称&#xff0c;即抽象队列同步器&#xff0c;从字面上可以这样理解: 抽象&#xff1a;抽象类&#xff0c;只实现一些主要逻辑&#xff0c;有些方法由子类实现&#xff1b;队列&#xff1a;使用先进先出&#xff08;FIFO&#xff09;的队列…

独立站外链如何影响搜索引擎排名?

独立站的外链对搜索引擎排名有着非常重要的影响。简单来说&#xff0c;外链就像是别的网站对你的网站投的信任票。每一条外链都告诉搜索引擎&#xff1a;“这个网站的内容是有价值的&#xff0c;值得推荐。”因此&#xff0c;外链的数量和质量直接影响你的网站在搜索引擎中的排…

ThinkPad改安装Windows7系统的操作步骤

ThinkPad&#xff1a;改安装Windows7系统的操作步骤 一、BIOS设置 1、先重新启动计算机&#xff0c;并按下笔记本键盘上“F1”键进入笔记本的BIOS设置界面。 2、进入BIOS设置界面后&#xff0c;按下键盘上“→”键将菜单移动至“Restart“项目&#xff0c;按下键盘上“↓”按键…