先检查,再编译以及编译的对应和引用传递问题

简介: Java泛型类型检查在编译时针对引用而非对象本身。即使类型擦除后变为Object,编译器仍会根据引用声明的泛型类型(如ArrayList<String>)对add等方法调用进行类型检查,确保类型安全。

这里我们可能会有一个疑问,既然说类型变量会在编译的时候擦除掉,那为什么上面的ArrayList中添加String类型的时候就报错了呢,因为String编译时候也会变成Object啊?
A:因为JAVA编译器是通过先检查代码中泛型的类型,然后再进行类型擦除,再进行编译的。那么这个检查到底是针对谁的,我们需要再明确下
A2:如我们上面代码是:
ArrayList list = new ArrayList();
现在我们写成:
ArrayList list = new ArrayList();
此时如果我们与之前的代码兼容,各种引用传值之间,必然会出现下面情况:
ArrayList list1 = new ArrayList(); //第一种 情况
ArrayList list2 = new ArrayList(); //第二种 情况
这样没错,但是会有个编译时警告,不过在第一种情况下,可以实现与完全使用泛型参数一样的效果,但是第二种没有效果。
因为类型检查是编译时完成的,new ArrayList()只是在内存中开辟一个存储空间,可以存储任何类型的对象,而真正涉及类型检查的是“它的引用”,即list1的方法调用,如add方法,所以list1引用能够完成泛型类型检查(前面声明了String),但是list2(后面声明的只是开辟内存空间,不涉及)由于前面的声明没有添加泛型,所以不行。

所以这里我们也大概知道了,所谓的类型(泛型)检查,是针对引用的。谁是一个引用,用这个引用调用泛型方法,就会对这个引用所调用的方法进行类型检查,而无关它真正引用的对象。

相关文章
|
2天前
|
存储
初始化Map大小并非用多少指定多少
初始化HashMap时,指定容量并非直接生效,而是会调整为最近的2的幂次(如1变2,7变8)。为避免扩容开销,建议使用Guava工具Maps.newHashMapWithExpectedSize(),或手动按公式:容量 = 预期元素数 / 0.75 + 1 设置。
什么是泛型擦除后保留的原始类型
原始类型是泛型擦除后生成的字节码中的实际类型。定义泛型类时,若无限定则类型变量被Object替换;若有上界限定(如T extends Comparable),则擦除为该限定类型。例如,Pair&lt;T&gt; 擦除为Object,而Pair&lt;T extends Comparable&gt; 擦除为Comparable。
|
1天前
|
运维 Kubernetes Java
物理部署图
物理部署图描述系统运行时的硬件配置与软件部署结构,展现节点、构件、物件及连接关系,帮助理解分布式系统的网络架构与运维部署,是开发与运维协同的重要建模工具。
|
1天前
|
领域建模
领域模型图(数据架构/ER图)
数据架构核心输出为ER图,包含实体、关系与属性,用于构建数据模型。通过业务域分解与领域建模,结合四色原型法(MI红色、PPT绿色、Role黄色、DESC蓝色)抽象业务,逐步提炼系统数据架构。
|
1天前
|
uml C语言
系统时序图
时序图(Sequence Diagram)是UML中描述对象间消息传递时间顺序的交互图。横轴为对象,纵轴为时间,通过生命线、控制焦点和消息展示动态协作。支持同步、异步与返回消息,可直观表达并发过程与方法调用,是分析系统行为的重要工具。(238字)
分布式应用架构
分布式应用架构图展示产品内部及与外部系统的应用调用关系,体现SOA架构下的逻辑与通信连接。重点呈现应用间的内外部依赖,清晰反映产品在整体业务中的定位与影响,不包含服务注册、治理等RPC技术细节。(238字)
|
1天前
|
数据挖掘
展现层
展现层是用户与系统交互的入口,根据不同用户类型提供差异化服务:为实操层用户支持日常业务操作,为管理层用户提供运营与团队数据分析以优化管理,为决策层用户呈现经营诊断报告,助力战略决策,实现分层高效交互。
|
2天前
|
开发框架 微服务
应用架构图
在业务架构基础上,技术架构承接应用需求,明确技术选型与分层设计。涵盖开发语言、框架、微服务分层及非功能性需求,通过关键技术选型与层级关系梳理,形成完整的技术架构图,实现产品需求到技术落地的转化。(238字)
绘制业务架构图的核心要义
绘制业务架构图是从业务收集、拆解到归纳的过程,核心在于分层、分模块、分功能。需淡化技术,聚焦业务逻辑,明确模块边界与功能抽象,确保架构清晰可迭代。
|
1天前
|
开发者
什么是业务架构图
业务架构图是将现实业务拆解为抽象层级与关系的工具,帮助清晰表达系统结构。对客户而言,提供直观简明的业务视图,提升理解;对开发者而言,明确系统组成、职责及关联,助力快速掌握整体业务逻辑。(238字)