Java 协变数组类型

Java 泛型中的协变数组和类型擦除 协变数组允许将子类型的数组赋值给父类型的数组,但需要注意在赋值过程中遵循类型的子类型关系。类型擦除在编译时将泛型类型的具体信息擦除,使用原始类型进行操作,这可能导致在运行时出现类型不匹配的异常。类型擦除是指在编译时期,泛型类型的具体类型信息被擦除,转而使用原始类型进行操作。在Java的泛型系统中,协变数组和类型擦除是两个重要的概念。协变数组是指在泛型中使用数组时,可以将子类型的数组赋值给父类型的数组。数组的元素,因为这可能会导致在运行时出现类型不匹配的异常。的子类型,这个赋值操作是合法的。 阅读详情

问题

  假设现在有 Person 类和 Employee 类,假设 Employee IS-A Person,那么,这是不是意味着数组 Employee[ ] IS-A Person[ ] 呢?换句话说,如果一个例程接受 Person[ ] 作为参数,我们能不能把 Employee[ ] 作为作为参数来传递呢?

思考

  乍一看,似乎 Employee[ ] 就应该和 Person[ ] 类型兼容。举个例子,假设除了 Employee 外,还有 Student IS-A Person,并假设 Employee[ ] 和 Person[ ] 是类型兼容的,此时考虑如下语句:

// 以下代码正常运行
Person[] arrayP1 = new Person[5];
arrayP1[0] = new Employee();
arrayP1[1] = new Student();

// 既然 Employee[] IS-A Person[]
// 那么意味着可将new Person[5]换为new Employee[5]
Person[] array = new Employee[5];
array[0] = new Employee();
array[1] = new Student();// ArrayStoreException

  array[0] 成功引用一个 Employee,array[1] 本来应该引用一个 Employee,却引用了一个 Student,可是 Student IS-NOT-A Employee,这样就造成了类型混乱,又因为不存在类型转换,Java 虚拟机不能抛出 ClassCastException 异常。

Java 协变数组类型

  避免上述问题最容易的方法是设定这些数组不是类型兼容的,可是,在 Java 中数组却是类型兼容的,这叫做协变数组类型。在 Java 中,每个数组都明了它所允许存储的对象类型,并且会在运行时做类型检查(这也是为什么不能创建泛型数组的原因,数组创建时必须知道确切类型)。如果像上面一样将一个不兼容的类型插入数组中,那么虚拟机将抛出一个 ArrayStoreException 异常。
  数组记得它内部元素的具体类型,并且会在运行时做类型检查。这就是当初敢于把数组设计成协变的原因,这也是为什么容器 Collection 不能设计成协变的原因(Collection 不做运行时类型检查)。

一点历史

  因为 JDK 1.5 之前还没有泛型,但很多代码迫切需要泛型来解决问题,就只能使用协变数组解决。这是对早期没有泛型的妥协,《Effective Java》中明确地指出,Java 允许数组协变是 Java 的缺陷。

12. Web安全—渗透测试用例—敏感信息泄漏 阅读详情

相关推荐

XC7Z010-1CLG400C开发板ADC引脚配置全攻略(附完整引脚列表)

本文详细解析了XC7Z010-1CLG400C开发板的ADC引脚配置方法,涵盖XADC模块基础、CLG400封装的引脚布局、硬件设计规范及Vivado工程配置实战。特别提供了完整的引脚列表和性能优化技巧,帮助开发者高效实现模拟信号采集,适用于Zynq-7000系列开发。

weixin_29188043的博客 466

TypeScript笔记——数组、元组、(协变、逆变、双向协变)、Symbol类型、类型断言

ts笔记——数组、元组、(协变、逆变、双向协变)、Symbol类型、类型断言

一起学习 770

Nuvoton OpenTitan开源安全芯片技术解析与应用

硬件安全模块(HSM)作为可信计算基的核心组件,其设计透明度和可验证性正成为行业焦点。RISC-V架构凭借开源特性,为构建可审计的安全芯片提供了新范式。OpenTitan项目通过开放Verilog源码和形式化证明,实现了从物理不可克隆函数(PUF)到分层安全启动的全栈透明。该方案在lowRISC Voyager开发板上实测显示,安全启动时间小于200ms,性能损耗仅7%,显著优于传统黑盒方案。目前该技术已应用于Chromebook和数据中心,其40nm工艺版本更将功耗降至5μA待机水平,为物联网和边缘计算提

weixin_36303807的博客 398

Java的协变数组类型

语言设计中的困难之一就是如何处理集合类型的继承问题。 假设Employee IS-A Person,那么,是不是意味着数据Employee[ ] IS-A Person[ ] 呢?换句话说,如果一个例程接受Person[ ] 作为参数,那么我们能不能把Employee[ ] 作为参数 来传递呢? 从表面上来看,似乎Employee[ ] 就应该是和Person[ ]类型兼容的。 现在假设除

DiligentDog的博客 1170

踩坑ubuntu24.04 编译vtk9.3.1的安卓版本

NDK官方明确废弃了旧版 armeabi ABI,强制使用armeabi-v7a或arm64-v8a。错误信息显示你的构建系统仍在使用超级构建(superbuild)模式,并且内部引用了已不再支持的。生成的合并库: $(pwd)/libvtk_combined.a"超级构建过程可能内部未充分考虑现代NDK变化导致内部配置ARM老ABI,重复失败。echo "正在提取所有.o文件..."echo "合并前所有库的总大小:"# 提取所有.a文件中的.o文件。echo "创建合并库..."

zhangyihu321的专栏 1892

绑定压力的计算方法

压强的公式为P=F/S,其中P为ACF要求的本压压强范围,S为受压面积,F为本压压头施加的力。绑定参数需要按线体按压头进行DOE确认,并使用DOE确认好的参数按压头重新绑定标识好送ACF厂商实测固化率、粒子变形的情况,避免绑定参数导致的异常,在绑定参数的设定过程中温度和时间可以使用仪器实测但绑定的压力则需要换算。工程上绑定压力换算的原则是:1、FPC属于柔性物料,柔性物料的受压面积按FPC绑定的受压面积=FPC绑定的长度。一、工程上FOG FPC本压压力换算(柔性材料以挤压的接触面积=受力面积)F=P。

weixin_53757859的博客 1533

泛型java 协变_Java中数组协变和范型不变性踩坑记录

前言变性是OOP语言不变的大坑,Java的数组协变就是其中的一口老坑。因为最近踩到了,便做一个记录。顺便也提一下范型的变性。解释数组协变之前,先明确三个相关的概念,协变、不变和逆变。下面话不多说了,来一起看看详细的介绍吧一、协变、不变、逆变假设,我为一家餐馆写了这样一段代码class Soup {public void add(T t) {}}class Vegetable { }class Ca...

weixin_31859277的博客 252

用户行为路径可视化_桑葚图(Sankey)

桑基图对用户行为路径可视化的blog学习笔记。

徐思孟的博客 3855

Java 泛型的协变与逆变

Java 泛型中的协变与逆变

qq_38074398的博客 1847

TMF8801 ToF激光测距传感器原理图设计,已量产(距离传感器)

这张 TMF8801 小板的外围结构就很有代表性。核心传感器是 U1 TMF8801,但真正构成量产价值的是外围那一圈:U2 把 VCC 整理成 3V,R1/R2/R5 与 R3/R4/R6 两组 10K 电阻稳定默认态,Q2 2N7002 和 U3 SN74LVC2G07DCKR 处理控制链路,传感器边上还有 C1/C4/C5 三颗 100nF 紧贴去耦。

不脱发的程序猿 159

【实战篇】【硅基流动API+Cherry Studio搭建个人知识库全流程解析:从零到精通的超详细指南】

在人工智能技术高速发展的今天,基于大语言模型的知识库已成为开发者提效的必备工具。然而云端服务存在响应延迟、数据隐私、硬件依赖等痛点。通过硅基流动API与的深度整合,我们既能享受大模型的强大能力,又能实现本地化部署与高效管理。本文将从环境配置到高阶调优,手把手带你构建企业级知识库系统。

商务合作|问题讨论|交流学习 请联系作者微信,加微信请务必注明来意,博客主页有联系方式 1082

Java泛型,数组和方法返回类型 - 协变,逆变和不变

协变vs逆变vs双变vs不变 Java支持不同的子类型规则:数组是协变的,可以从子类型转换为超类型,但可能引发ArrayStoreException。泛型默认是不变的,特定类型T的泛型不支持协变或逆变替换。通过使用通配符'?'和'extends'或'super',可以使泛型实现协变或逆变。此外,Java允许子类方法返回更具体的类型,这被称为协变返回类型。

qingchen191的专栏 1259

用 DCL 编写 DEFINE ROLE:把 ABAP CDS 的访问控制做对、做实、做漂亮

摘要: 本文详细讲解如何在ABAP CDS中使用DCL(数据控制语言)实现行级授权,确保业务数据安全。核心要点包括: DCL原理:通过DEFINE ROLE将访问条件绑定到CDS实体,自动附加到查询条件(类似隐式WHERE),保障授权一致性。 关键语法: 必需注解@MappingRole: true声明映射角色。 ASPECT pfcg_auth关联PFCG权限对象,动态控制访问。 注解@AccessControl.authorizationCheck定义授权检查策略(如#CHECK启用强制控制)。 优先级

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 166

java 协变数组类型

java 协变数组类型 主要表现编译期没错,运行期间抛出java.lang.ArrayStoreException 代码实例: 父类 public class Persion { private String name; private Integer age; public Persion(String name,Integer age) { this.name = name; this.age = age; } @Ov

i_am_bad_man的博客 224

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

协变数组和类型擦除(java)

java_协变数组和类型擦除数组的协变性数组的具体化泛型不是协变的 数组的协变性 数组的协变性(covariant)是指: 如果类Base是类Sub的基类,那么Base[]就是Sub[]的基类。 而泛型是不可变的(invariant),List不会是List的基类,更不会是它的子类。 数组的协变性可能会导致一些错误,比如下面的代码: public static void main(String...

xuzhihaoGoGo的博客 240

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Java 协变数组和类型擦除

1、数组的协变性 数组的协变性(covariant)是指: 如果类Base是类Sub的基类,那么Base[]就是Sub[]的基类。 而泛型是不可变的(invariant),List不会是List的基类,更不会是它的子类。 数组的协变性可能会导致一些错误,比如下面的代码: public static void main(String[] args) {

页面无法显示_(:з」∠)__ 552

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Java——协变数组和类型擦除

          Java——协变数组和类型擦除(covariant array type erasure) 1、数组的协变性 数组的协变性(covariant)是指: 如果类Base是类Sub的基类,那么Base[]就是Sub[]的基类。 而泛型是不可变的(invariant),List不会是List的基类,更不会是它的子类。   2 数组的具体化。 数组是具体化的(...

iteye_4972的博客 195

Java协变数组和类型擦除

1、数组的协变性 数组的协变性(covariant)是指: 如果类Base是类Sub的基类,那么Base[]就是Sub[]的基类。 而泛型是不可变的(invariant),List不会是List的基类,更不会是它的子类。 数组的协变性可能会导致一些错误,比如下面的代码: ? 1 2 3 4 public

The Void 515

Java——协变数组和类型擦除(covariant array ; type erasure)

1、数组的协变性数组的协变性(covariant)是指:如果类Base是类Sub的基类,那么Base[]就是Sub[]的基类。而泛型是不可变的(invariant),List不会是List的基类,更不会是它的子类。数组的协变性可能会导致一些错误,比如下面的代码:1234public static void main(String[] args) {     Object[] array = new

u011251014的博客 544

Java——协变数组和类型擦除以及泛型相关知识

近期读到协变数组和类型擦除,涉及相关的泛型和数组的知识不是很了解。所以专门找了资料整理了一下。 1.数组的协变性 数组的协变性(covariant)是指如果sub是base的子类,那么sub[]是base[]的子类。泛型不是协变的,泛型是不可变的。 数组的协变性可能会导致一些错误,比如下面的代码: public static void main(String[] args) {

通往花开的路上 878

Java学习:协变数组和类型擦除(covariant array ; type erasure)

数组的协变性数组的协变性(covariant)是指:如果类Base是类Sub的基类,那么Base[]就是Sub[]的基类。而泛型是不可变的(invariant),List不会是List 的基类,更不会是它的子类。

KesarChen的博客 5973

Java——协变数组和类型擦除(covariant array type erasure)

1、数组的协变性 数组的协变性(covariant)是指: 如果类Base是类Sub的基类,那么Base[]就是Sub[]的基类。 而泛型是不可变的(invariant),List不会是List的基类,更不会是它的子类。 数组的协变性可能会导致一些错误,比如下面的代码: ? 1 2 3 4 public

自慎 3623

\(^_^)/ Java中的协变数组类型

下面代码执行有什么结果: class Person { public void print() { System.out.println("Person"); } } class Worker extends Person { public void print() { System.out.println("Worker"); } } c...

yanguz的专栏 244

Java——协变数组和类型擦除(covariant array & type erasure)

1、数组的协变性 数组的协变性(covariant)是指: 如果类Base是类Sub的基类,那么Base[]就是Sub[]的基类。 而泛型是不可变的(invariant),List不会是List的基类,更不会是它的子类。 数组的协变性可能会导致一些错误,比如下面的代码: public static void main(String[] args) { Object[] ar

JPing的专栏 3634

Java 协变数组和类型擦除(covariant array & type erasure)

来源:Linux社区  作者:xsc_c 1、数组的协变性 数组的协变性(covariant)是指: 如果类Base是类Sub的基类,那么Base[]就是Sub[]的基类。 而泛型是不可变的(invariant),List不会是List的基类,更不会是它的子类。 数组的协变性可能会导致一些错误,比如下面的代码: public static v

blackgooes的博客 445

《数据结构与算法》之泛型——数组类型的兼容性

如Employee和Student都继承自Person,考虑下面两条赋值语句: Person arr=new Employee[5]; //Employee和Person是兼容的 arr[0]=new Student(……); //Student和Person也是兼容的 两句都编译,而arr[0]实际上是引用一个Employee,可是Student和Employee是不兼容的,这...

漫步莱茵河畔的博客 520
上一篇: 蓝桥杯 基础练习 Fibonacci数列
下一篇: Java fail-fast 机制
ali48
博客等级 码龄6年 31粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值