仓颉编程语言:泛型类型的子类型关系

仓颉语言 -- 泛型 阅读详情

实例化后的泛型类型间也有子类型关系。例如当我们写出下列代码时,

interface I<X, Y> { }

class C<Z> <: I<Z, Z> { }

根据第 3 行,便知 C<Bool> <: I<Bool, Bool> 以及 C<D> <: I<D, D> 等。这里的第 3 行可以解读为“于所有的(不含类型变元的) Z 类型,都有 C<Z> <: I<Z, Z> 成立”。

但是对于下列代码

open class C { }
class D <: C { }

interface I<X> { }

I<D> <: I<C> 是不成立的(即使 D <: C 成立),这是因为在仓颉语言中,用户定义的类型构造器在其类型参数处是不型变的。

型变的具体定义为:如果 A 和 B 是(实例化后的)类型,T 是类型构造器,设有一个类型参数 X(例如 interface T<X>),那么

  • 如果 T(A) <: T(B) 当且仅当 A = B,则 T 是不型变的。
  • 如果 T(A) <: T(B) 当且仅当 A <: B ,则 T 在 X 处是协变的。
  • 如果 T(A) <: T(B) 当且仅当 B <: A ,则 T 在 X 处是逆变的。

因为现阶段的仓颉中,所有用户自定义的泛型类型在其所有的类型变元处都是不变的,所以给定 interface I<X> 和类型 A、B,只有 A = B,我们才能得到 I<A> <: I<B>;反过来,如果知道了 I<A> <: I<B>,也可推出 A = B(内建类型除外:内建的元组类型对其每个元素类型来说,都是协变的;内建的函数类型在其入参类型处是逆变的,在其返回类型处是协变的。)

不型变限制了一些语言的表达能力,但也避免了一些安全问题,例如“协变数组运行时抛异常”的问题(Java 便有这个问题)。

华为仓颉编程语言观感 华为仓颉编程语言概览 阅读详情

相关推荐

鸿蒙HarmonyOS应用开发 | 仓颉语言中的泛型编程应用与实践【泛型类型的子类型关系、类型别名、泛型约束】

在许多编程语言中,泛型是一项强大的功能,允许创建灵活且可重用的代码组件。在仓颉语言(Cangjie)中,泛型扮演着重要角色,使开发者能够定义类型安全的抽象。本文将深入探讨仓颉语言中的泛型概念,特别是泛型类型的子类型关系,以及如何利用这些关系来编写更为安全且高效的代码。

一键难忘的博客 1957

仓颉编程语言中的泛型类型系统:泛型结构体、泛型枚举、泛型类型的子类型关系

摘要:仓颉编程语言的泛型系统支持结构体、枚举等参数化类型。泛型结构体通过类型参数实现数据复用,是值类型且不支持继承。Option<T>枚举用于安全处理可能为空的值。泛型类型默认不型变,确保类型安全,仅内建类型如元组和函数具有特定型变规则。泛型约束通过where子句限制类型参数能力。该系统在保证安全性的同时提供了灵活的抽象能力。

Huang兄 958

仓颉编程语言中的泛型类、泛型结构体与泛型枚举

在现代编程中,泛型是一个非常重要的概念。它允许我们编写更具通用性和可重用性的代码,而不必在编写代码时确定具体的数据类型。本文将介绍仓颉编程语言中泛型类、泛型结构体与泛型枚举的定义和使用。

一键难忘的博客 3076

仓颉编程语言:子类型关系

如何判定两个类型是否存在子类型关系?

Androidbye的博客 843

仓颉编程语言中的泛型探究【泛型概述、泛型函数、泛型接口】

在编程中,泛型(Generics)是指参数化类型。简单来说,参数化类型就是在声明时类型未知,需要在使用时指定的类型。这种机制使得我们可以编写更通用和可复用的代码。在仓颉编程语言中,类型声明与函数声明都可以是泛型的,常见的例子包括Array和Set等容器类型。首先,我们定义一个缓存接口Cache,该接口包含get和put方法。泛型是一个强大的工具,它使得我们可以编写更加通用、灵活和可复用的代码。通过本文的介绍,希望大家能够对仓颉编程语言中的泛型有一个全面的了解,并能够在实际开发中熟练应用泛型。

一键难忘的博客 4329

仓颉语言的属性和子类型关系详解【属性、子类型关系、类型转换】

属性可以在interfaceclassstructenum和extend中定义。set(v) {}在这个例子中,a是一个只读属性,而b是一个可读可写的属性。属性的getter和setter分别对应两个不同的函数。在仓颉语言中,属性可以在classinterfacestructenum和extend中定义。set(v) {}上面的代码中,我们定义了两个属性a和b,它们的类型都是Int64。属性a只有 getter 方法,因此它是只读的;属性b。

一键难忘的博客 2773

仓颉编程语言:泛型约束

泛型约束的作用是在函数、class、enum、struct 声明时明确泛型形参所具备的操作与能力。

Androidbye的博客 880

AD21导出gerber文件

文件–>制造输出–>Gerber Files 文件–>制造输出–>Gerber Files 通用、光圈和高级跟第一步一样 3.文件–>制造输出–>NC Drill Files 这个默认就可以了 主要参考视频来自bilibili添加链接描述 此篇博客主要是写给自己好记的,无其他商业用途 ...

新手小杨 1万+

仓颉编程语言:泛型概述

在仓颉编程语言中,泛型指的是参数化类型,参数化类型是一个在声明时未知并且需要在使用时指定的类型。

Androidbye的博客 1152

HWSD中国土壤数据库

T_PH_H2O: Real (酸碱度) T_CEC_CLAY: Real (粘性层土壤的阳离子交换能力);T_CEC_SOIL: Real (土壤的阳离子交换能力) T_BS: Real (基本饱和度);T_CACO3: Real (碳酸盐或石灰含量) T_CASO4: Real (硫酸盐含量);ADD_PROP: Real (土壤单元中与农业用途有关的特定土壤类型);T_USDA_TEX: Real (USDA土壤质地分类);T_REF_BULK: Real (土壤容重);

地球资源数据云的官方博客 4654

【SPSS实战】手动实现Quade非参数协方差分析:从数据准备到结果解读

本文详细介绍了在SPSS中手动实现Quade非参数协方差分析的全过程。针对数据不满足正态性和方差齐性假设时,如何通过秩转换、回归调整残差,并最终利用Kruskal-Wallis检验完成组间比较。该方法为处理含协变量的非参数多组比较问题提供了清晰的实战解决方案,并探讨了其与标准Quade检验的异同及适用场景。

weixin_29306317的博客 358

深入探索仓颉编程语言:函数与结构类型的终极指南

仓颉语言允许多种风格的函数定义方式,支持显式参数类型和自动类型推导。// 一个简单的求和函数// 自动类型推导结构类型是仓颉语言中用于组合数据的核心方式。x: int,y: int,// 输出: 10本文深入剖析了仓颉编程语言的基础数据类型及其高级用法,并通过代码示例展示了每种类型的实际应用场景。希望读者能够通过本文掌握仓颉语言的核心思想,并在实践中灵活运用,构建高效优雅的应用程序。通过以上步骤,相信你已经初步了解了仓颉编程语言的安装和使用。

2301_80863610的博客 2255

MEG预处理-Brainstorm

Brainstorm下载和安装 去Brainstorm官网进行下载:打开网页后,点击左侧Download;在跳出来的界面中进行简单的注册,注册完成后可以进行下载 解压后得到“brainstorm3”的文件夹,里面包含Brainstorm工具包的所有文件,把这个文件夹放在某个路径如"E:\matlab_tools\brainstorm3"即可 同样在某个路径建立空的文件夹命名为:brainstorm_db用于工具包运行过程中自动存储生成的文件,所以这个文件中生成的数据不要手动移动删除 在Matlab中,把.

AxeChen的博客 6127

46-泛型-枚举-子类型关系

在仓颉编程语言中,泛型 enum 声明的类型里被使用得最广泛的例子之一就是Option类型了,关于Option详细描述可以详见章节。Option类型是用来表示在某一类型上的值可能是个空的值。这样,Option就可以用来表示在某种类型上计算的失败。这里是何种类型上的失败是不确定的,所以很明显,Option是一个泛型类型,需要声明类型形参。可以看到,Option分成两种情况,一种是Some(T),用来表示一个正常的返回结果,另一种是None用来表示一个空的结果。其中的getOrThrow函数会是将。

不懂先生的博客 518

微信Dat文件转图片(文末含工具下载)

PC端微信dat图片转换为jpg格式

weixin_40704848的博客 8096

手把手教你用STM32的SPI驱动MCP2517FD实现CAN FD通信(附完整代码)

本文详细介绍了如何使用STM32通过SPI驱动MCP2517FD实现CAN FD通信,涵盖硬件连接、SPI驱动编写、寄存器配置及数据收发实战。提供完整代码示例和常见问题排查指南,帮助开发者快速构建高可靠性的CAN FD通信系统,适用于汽车电子和工业控制等领域。

weixin_30607029的博客 676

仓颉实战系列 - 泛型 类型形参与类型变元

如果 A 和 B 是类型,T 是类型构造器,设其有一个类型参数 X,那么:• 如果 T(A) <: T(B) 当且仅当 A <: B,则 T 在 X 处是协变的。• 如果 T(A) <: T(B) 当且仅当 B <: A,则 T 在 X 处是逆变的。• 如果 T(A) <: T(B) 当且仅当 A = B,则 T 是不型变的。

2301_79516858的博客 1025

【计算机视觉】语义分割实战:FCN、U-Net与DeepLab系列详解

语义分割实战:FCN、U-Net与DeepLab系列详解,人工智能、大模型、AI深度学习在计算机视觉领域取得了令人瞩目的进展,语义分割作为计算机视觉领域的关键任务,旨在将图像中的每个像素都分配到特定的类别中,实现对图像内容的精细理解。与目标检测关注物体的类别与位置不同,语义分割能够对场景中的所有元素进行像素级别的分类,这在自动驾驶、医学图像分析、遥感图像解译等众多领域都有着至关重要的应用。例如,在自动驾驶中,准确的语义分割可以帮助车辆识别道路、行人、交通标志等,为安全行驶提供决策依据;在医学图像分析中……

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 9万+

仓颉编程语言入门

五年磨一剑,华为仓颉编程语言正式发布。

程小二的博客 4万+

【WRF数据准备】土地利用数据-MODIS MCD12Q1数据下载及制备

【WRF数据准备】MODIS静态地理数据下载及制备

WW、forever的博客 3413

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

仓颉从入门到精通 - 泛型接口 泛型接口

泛型可以用来定义泛型接口,以标准库中定义的 Iterable 为例,它的成员函数 iterator 需要返回一个 Iterator 类型,这一类型是一个容器的遍历器。 Iterator 是一个泛型接口,Iterator 内部有一个从容器类型中返回下一个元素的 next 成员函数,next 成员函数返回的类型是一个需要在使用时指定的类型,所以 Iterator 需要声明泛型参数。 泛型类 泛型接口中介绍了泛型接口的定义和使用,本节介绍泛型类的定义和使用。如 Map 的键值对就是使用泛型类来定义的。Map 类型

wanmeijuhao的博客 725

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

基于华为开发者空间,仓颉之泛型和扩展的神奇天地

案例结合代码体验,帮助大家更直观的了解仓颉语言泛型和扩展知识。

华为云官方博客 1885

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

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

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

仓颉编程语言青少年基础教程:泛型(Generic)和区间(Range)类型

本文介绍仓颉编程语言中的泛型(Generic)和区间(Range)类型。泛型允许我们编写更加通用、类型安全的代码。通过泛型,可以在定义函数、类、接口等时使用类型参数,实现代码复用。区间(Range )类型是一个泛型,用于表示一个拥有固定步长的序列。

cnds123的专栏 1251

仓颉编程语言:泛型枚举

Option 类型是用来表示在某一类型上的值可能是个空的值。

Androidbye的博客 844

仓颉编程基础篇---泛型接口

由于泛型类的静态成员变量的内存是共享的,因此,静态成员变量或属性的类型声明和表达式中不能引用类型参数或包含未实例化泛型类型表达式。抽象类:在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。在仓颉编程语言中,泛型指的是参数化类型,参数化类型是一个在声明时未知并且需要在使用时指定的类型。类型声明与函数声明可以是泛型的。类型形参在声明时一般在类型名称的声明或者函数名称的声明后,使用尖括号。

qq_55750963的博客 891

仓颉之泛型和扩展的神奇天地

仓颉编程语言作为一款面向全场景应用开发的现代编程语言,通过现代语言特性的集成、全方位的编译优化和运行时实现、以及开箱即用的 IDE工具链支持,为开发者打造友好开发体验和卓越程序性能。案例结合代码体验,帮助大家更直观的了解仓颉语言泛型和扩展知识。在仓颉编程语言中,泛型是一种通过参数化类型来增强代码复用性和类型安全性的机制,class、interface、struct、enum均可声明类型形参。登录后复制//定义泛型列表//elem的类型是Option<T>,表示可空值。

计算机毕业论文源码,学生个人网页制作html源码。贴近用户做网络推广和互联网优化。 916
上一篇: 仓颉编程语言:泛型枚举
下一篇: 仓颉编程语言:泛型约束
懂你的大海
博客等级 码龄6年 9049粉丝 1381原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值