Java 泛型<? extends Object>

在 Java 泛型中,<? extends Object> 和 <?> 都表示未知类型,但它们在某些情况下有细微的差异。泛型的引入是为了消除运行时错误并增强类型安全性,使代码更具可读性和可维护性。

在 JDK 5 中引入了泛型,以消除编译时错误并加强类型安全性。这种额外的类型安全性消除了某些用例中的强制转换,并使程序员能够编写泛型算法,从而生成更具可读性的代码

通配符的使用

通配符在泛型中用来表示未知类型。它可以有三种形式:

  • 无界通配符:List<?> 表示未知类型的列表。

  • 上界通配符:List<? extends Number> 表示 Number 或其子类型(如 Integer 和 Double)的列表。

  • 下界通配符:List<? super Integer> 表示 Integer 或其超类型 Number 和 Object 的列表。

<?> 和 <? extends Object> 的相同之处

在大多数情况下,<?> 和 <? extends Object> 是相同的。例如,以下两个方法的行为是相同的:

java 复制代码
public static void printListWildCard(List<?> list) {
	for (Object element : list) {
		System.out.print(element + " ");
	}
}

public static void printListWildCard(List<? extends Object> list) {
	for (Object element : list) {
		System.out.print(element + " ");
	}
}

这两个方法都可以处理 List。

<?> 和 <? extends Object> 的不同之处

虽然在大多数情况下它们是相同的,但在某些情况下它们有细微的差异。一个显著的区别是 <?> 是可重构的,而 <? extends Object> 不是

例如:

java 复制代码
List<?> someList = new ArrayList<>();
boolean instanceTest = someList instanceof List<?>;

上述代码可以编译并且 instanceTest 为 true。但是,如果使用 <? extends Object>:

java 复制代码
List<? extends Object> anotherList = new ArrayList<>();
boolean instanceTest = anotherList instanceof List<? extends Object>;

上述代码将无法编译。

虽然 <?> 和 <? extends Object> 在大多数情况下是相同的,但在可重构性方面存在细微差异。

相关推荐
淡海水18 小时前
C#与常用数据结构源码剖析-全篇导览
开发语言·数据结构·unity·面试·职场和发展·c#
wear工程师18 小时前
Java 类初始化到底何时触发?别把加载、连接和 static 执行混在一起
java·jvm
hard_hot18 小时前
RabbitMQ异步下单架构设计
java·rabbitmq·java-rabbitmq
问天_观心18 小时前
python之uv库的学习
开发语言·python
郑州光合科技余经理18 小时前
餐饮预定系统架构拆解:订单链路、权限组织与私有化源码交付
java·开发语言·前端·数据库·人工智能·系统架构·php
在世修行18 小时前
从零打造 C# 工业视觉检测系统(十五):项目打包部署与进阶展望
开发语言·c#·视觉检测
vx-程序开发18 小时前
django汽车租赁系统---附源码25360
java·javascript·spring boot·python·eclipse·django·php
笨鸟先飞,勤能补拙18 小时前
AI Agent应用领域深度解析:从概念到落地的全维度审视
大数据·人工智能·python·物联网·安全·网络安全·github
zhougl99618 小时前
Java实现腾讯云开发者社区列表爬虫
java·爬虫·腾讯云
智码看视界18 小时前
Day49-AI微服务化-将大模型能力封装为标准微服务
java·微服务·ai·架构·大模型·sse流式输出·ai中台