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

【华为仓颉编程语言】运行第一个仓颉程序 上节课我们成功安装了仓颉工具链,今天让我们一起编写并运行第一个仓颉程序。相信很多同学都还记得学习第一门编程语言时写的"Hello World"程序,那种看到程序成功运行的激动心情。今天,我们就要在仓颉语言中重现这个经典时刻! 阅读详情

与其他面向对象语言一样,仓颉语言提供子类型关系和子类型多态。举例说明(不限于下述用例):

  • 假设函数的形参是类型 T,则函数调用时传入的参数的实际类型既可以是 T 也可以是 T 的子类型(严格地说,T 的子类型已经包括 T 自身,下同)。
  • 假设赋值表达式 = 左侧的变量的类型是 T,则 = 右侧的表达式的实际类型既可以是 T 也可以是 T 的子类型。
  • 假设函数定义中用户标注的返回类型是 T,则函数体的类型(以及函数体内所有 return 表达式的类型)既可以是 T 也可以是 T 的子类型。

那么如何判定两个类型是否存在子类型关系呢?下面我们对此展开说明。

继承 class 带来的子类型关系

继承 class 后,子类即为父类的子类型。如下代码中, Sub 即为 Super 的子类型。

open class Super { }
class Sub <: Super { }

实现接口带来的子类型关系

实现接口(含扩展实现)后,实现接口的类型即为接口的子类型。如下代码中,I3 是 I1 和 I2 的子类型, C 是 I1 的子类型, Int64 是 I2 的子类型:

interface I1 { }
interface I2 { }

interface I3 <: I1 & I2 { }

class C <: I1 { }

extend Int64 <: I2 { }

需要注意的是,部分跨扩展类型赋值后的类型向下转换场景(is 或 as)暂不支持,可能出现判断失败,见如下示例:

// file1.cj
package p1

public class A{}

public func get(): Any {
    return A()
}

// =====================
// file2.cj
import p1.*

interface I0 {}

extend A <: I0 {}

main() {
    let v: Any = get()
    println(v is I0) // 无法正确判断类型,打印内容不确定
}

元组类型的子类型关系

仓颉语言中的元组类型也有子类型关系。直观的,如果一个元组 t1 的每个元素的类型都是另一个元组 t2 的对应位置元素类型的子类型,那么元组 t1 的类型也是元组 t2 的类型的子类型。例如下面的代码中,由于 C2 <: C1 和 C4 <: C3,因此也有 (C2, C4) <: (C1, C3) 以及 (C4, C2) <: (C3, C1)。

open class C1 { }
class C2 <: C1 { }

open class C3 { }
class C4 <: C3 { }

let t1: (C1, C3) = (C2(), C4()) // OK
let t2: (C3, C1) = (C4(), C2()) // OK

函数类型的子类型关系

仓颉语言中,函数是一等公民,而函数类型亦有子类型关系:给定两个函数类型 (U1) -> S2 和 (U2) -> S1,(U1) -> S2 <: (U2) -> S1 当且仅当 U2 <: U1 且 S2 <: S1(注意顺序)。例如下面的代码定义了两个函数 f : (U1) -> S2 和 g : (U2) -> S1,且 f 的类型是 g 的类型的子类型。由于 f 的类型是 g 的子类型,所以代码中使用到 g 的地方都可以换为 f。

open class U1 { }
class U2 <: U1 { }

open class S1 { }
class S2 <: S1 { }



func f(a: U1): S2 { S2() }
func g(a: U2): S1 { S1() }

func call1() {
    g(U2()) // Ok.
    f(U2()) // Ok.
}

func h(lam: (U2) -> S1): S1 {
    lam(U2())
}

func call2() {
    h(g) // Ok.
    h(f) // Ok.
}

对于上面的规则,S2 <: S1 部分很好理解:函数调用产生的结果数据会被后续程序使用,函数 g 可以产生 S1 类型的结果数据,函数 f 可以产生 S2 类型的结果,而 g 产生的结果数据应当能被 f 产生的结果数据替代,因此要求 S2 <: S1。

对于 U2 <: U1 的部分,可以这样理解:在函数调用产生结果前,它本身应当能够被调用,函数调用的实参类型固定不变,同时形参类型要求更宽松时,依然可以被调用,而形参类型要求更严格时可能无法被调用——例如给定上述代码中的定义 g(U2()) 可以被换为 f(U2()),正是因为实参类型 U2 的要求更严格于形参类型 U1 。

永远成立的子类型关系

仓颉语言中,有些预设的子类型关系是永远成立的:

  • 一个类型 T 永远是自身的子类型,即 T <: T。
  • Nothing 类型永远是其他任意类型 T 的子类型,即 Nothing <: T。
  • 任意类型 T 都是 Any 类型的子类型,即 T <: Any。
  • 任意 class 定义的类型都是 Object 的子类型,即如果有 class C {},则 C <: Object。

传递性带来的子类型关系

子类型关系具有传递性。如下代码中,虽然只描述了 I2 <: I1,C <: I2,以及 Bool <: I2,但根据子类型的传递性,也隐式存在 C <: I1 以及 Bool <: I1 这两个子类型关系。

interface I1 { }
interface I2 <: I1 { }

class C <: I2 { }

extend Bool <: I2 { }

写在最后

  • 如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
  • 关注小编,同时可以期待后续文章ing ,不定期分享原创知识。

国产自研编程语言“仓颉”来了! 在探索仓颉编程语言的旅程中,我们领略了其独特的设计理念、强大的功能和无尽的潜力。从基础的数据类型到复杂的算法结构,仓颉语言展现了一种既注重效率又追求简洁与优雅的编程范式。其枚举类型作为语言中的一个重要组成部分,不仅增强了代码的可读性和类型安全性,还为开发者提供了更多的灵活性和便利性。然而,仓颉语言仍然是一个不断发展的领域,它将继续吸引来自全球各地的开发者们共同探索和创新。我们期待着未来仓颉语言能够带来更多的惊喜和突破,为解决现实世界中的复杂问题提供更加高效和可靠的编程工具。 阅读详情

相关推荐

仓颉编程语言:基本概念

在以上程序中,if 表达式作为变量定义的初值使用,由于变量 bit 没有被标注类型、需要从初值中推导,所以 if 表达式的类型取为两个分支代码块类型的最小公共父类型,根据前文对“代码块”的介绍,可知两个分支代码块类型都是 Int8,所以 if 表达式的类型被确定为 Int8,其值为所执行分支即 else 分支代码块的值,所以变量 bit 的类型为 Int8、值为 1。在仓颉程序中,由一对大括号“{}”包围起来的一组表达式,被称为“代码块”,它将作为程序的一个顺序执行流,其中的表达式将按编码顺序依次执行。

啥也不会的云计算小白 3124

华为仓颉语言入门(6):if条件表达式

本文详细解析了仓颉语言中的 if 表达式及其三种形式:单分支、双分支和嵌套的 if 表达式。通过示例展示了如何根据条件执行不同代码块,并探讨了在条件判断中进行类型推断的机制。文中还扩展了代码实例,演示了复杂条件的处理、最佳实践以及如何优化嵌套条件语句,确保代码逻辑清晰且易于维护。

一个被知识诅咒的人 1868

鸿蒙应用开发之仓颉编程语言基础

仓颉编程语言是华为公司独立研发并开源的一种面向全场景应用开发的通用编程语言,可以兼顾开发效率和运行性能,并提供良好的编程体验。

sinat_30844883的博客 2904

华为仓颉语言入门(5):条件测试

本文主要介绍了仓颉语言中的条件测试和逻辑运算,包括数值类型数据的比较、相等性测试、字符串大小写敏感比较以及浮点数的精度问题。通过逻辑运算符 &&、|| 和 ! 可以构建复杂的逻辑表达式,利用逻辑与、逻辑或的规则组合条件判断。文章还详细讲解了如何处理复杂条件组合,并提供了代码示例和运算表格,帮助读者更好地理解布尔逻辑在编程中的应用。

一个被知识诅咒的人 1392

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

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

一键难忘的博客 2773

拼多多爬虫实战:逆向sign与anti_content动态参数解析

现代电商爬虫已远超基础HTTP请求范畴,其核心在于理解服务端如何通过动态签名(sign)、设备指纹、行为验证等多维机制定义‘合法请求’。拼多多作为典型代表,将价格、销量、评价等关键数据完全剥离HTML,转由强校验API返回,依赖HMAC-SHA256嵌套签名、anti_content前端加密载荷及滑动验证token闭环。这类机制本质上是客户端环境可信度与请求上下文一致性的实时博弈,技术价值在于保障数据安全与业务风控。典型应用场景包括竞品价格监控、销量趋势分析、评价情感挖掘等需高保真数据的商业分析任务。本文聚

weixin_29741447的博客 835

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

实例化后的泛型类型间也有子类型关系

Androidbye的博客 408

【CQUT】从零开始龙芯杯-开始前的准备

不同级别的Cpu对于vivado综合的时间有较大影响,其中Cpu的单核、多核性能以及cache性能影响权重较高。因此,为了保证学习进度和效率,我们建议在Cpu不低于I5 12400的环境下进行学习。Vivado2023.2安装包约100GB,为了保证成功安装建议留出300GB硬盘空间。龙芯杯的许多资料被托管在gitee,你需要git指令将资料克隆到本地。指定用书:CPU设计实战 Loongarch版 作者:汪文祥、邢金璋。Cpu性能对比网站:https://www.cpu114.com/

weixin_73689971的博客 911

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

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

Huang兄 958

西门子S7-1200控制伺服/步进电机方法与接线(全)

西门子S7-1200控制伺服/步进电机方法与接线(全) 伺服/步进电机在非标自动化控制中十分常用,但作者发现在各类开源网站上很少有人做西门子1200PLC控制伺服/步进电机的教程,于是今天想着跟大家分享一下。 本文共分为一下几个四个内容。 文章目录西门子S7-1200控制伺服/步进电机方法与接线(全)前言一、准备二、接线1.PLC接线:2.伺服接线:3. 步进电机的接线:三、代码组态代码四、可能出现的问题 前言 工程控制常用到三项异步电机、直流电机等,但他们都无法准确的控制电机角度;于是有了步进电机、

weixin_46060068的博客 7万+

从零到一:R与RStudio的安装与配置全攻略

本文提供了R与RStudio的完整安装与配置指南,涵盖Windows、Mac和Linux三大操作系统。从基础环境搭建到高级性能优化,详细介绍了R语言安装、RStudio配置、项目管理和实用技巧,帮助数据科学初学者快速搭建高效的分析工作环境。

weixin_29062671的博客 421

仓颉语言子类型关系详解:从继承、接口到元组与函数类型的多态机制

在面向对象编程中,子类型关系(subtype relationship)是支撑"多态"这一核心能力的基石:凡是需要父类型(或接口)的地方,都可以安全地放入其子类型的实例。本文系统梳理仓颉(Cangjie)编程语言中建立子类型关系的全部途径——包括 `class` 继承、接口实现(含扩展实现)、元组类型、函数类型、内建"永远成立"的关系以及传递性,并结合仓库中 [子类型关系(英文原档)](https

gitblog_00332的博客 265

OpenClaw 实战:7个真实场景的多 Agent 落地经验

《OpenClaw实战:7个真实场景的多Agent落地经验》摘要: 作者Maynor分享了从单Agent转向多Agent架构的实战经验。最初遇到的单Agent记忆混乱问题(如Flutter助手被C++话题干扰),通过拆分专项Agent(flutter-tutor/cpp-tutor等)并配置独立workspace解决。随后面临的技能调用混乱问题,采用"基础通用能力+专属能力"分层策略,通过Clawhub管理工具市场,将工具调用准确率从60%提升至95%。最后探讨多Agent协同方案,引入

Maynor的博客 1414

仓颉编程语言接口(Interface)完全指南:抽象类型、接口继承与实现规范

接口(`interface`)是仓颉编程语言中定义抽象类型、约定类型行为并实现功能抽象的核心机制。本文基于 [docs/dev-guide/source_zh_cn/class_and_interface/interface.md](https://link.gitcode.com/i/14ae754321c0da5b986d685bad711bf3) 系统讲解接口的定义、`sealed` 限制、

gitblog_01097的博客 296

两组相机(或三维点)对齐方法介绍及实现代码(求解相似变换,包含旋转R、平移t、尺度s)

  这个变换用于将生成的稀疏重建场景对齐到真值上。由于SfM(Structure from Motion,运动恢复结构)求解的结果是尺度未定的,所以重建场景与真值之间不仅会相差一个旋转与平移,还会存在尺度缩放。待求解的问题可以描述为:已知一组相机(个数为m)的位姿真值Rgt、tgt和预测位姿Rpred、tpred,现要将预测值对齐到真值上。它们之间会相差一个相似变换Msimilarity,包括尺度s、旋转量R、平移量t,可以根据如下步骤进行求解:    1 求解旋转R   首先计算所有m个相机的位姿差异总和

zeeq的博客 3927

下载猫 —— 会员体系安全分析与加固方案

下载猫的会员验证体系完全失效,破解不需要任何工具链、不需要写代码、不需要改文件。已验证的成功攻击路径:攻击者启动软件时加一个参数,然后用 3 行 JavaScript 即可将会员状态改为"有效期至 2099 年",全部功能闸门放行。等价于普通用户按F12打开控制台输入 3 行代码,全程不到 10 秒。项目结论破解难度⭐ 极低(会按 F12 即可,无需任何破解工具)是否修改文件否(重启软件自动恢复)是否需要服务器否是否影响其他用户单人即可完成,可复制分发修复所需工作量。

猫敷雪 59

KMS 激活 Windows 7~11 与 Office:两种激活方式、180 天有效期,一次讲清

右下角那个"激活 Windows"水印、Office 弹的"产品未获许可",都是没激活的信号。KMS_VL_ALL_AIO 是个开源脚本,在本机架起一套企业 KMS 服务器替你走完 KMS 激活,覆盖 Windows 7 SP1 到 Windows 11 和 Office 2010 到 2024,激活一次管 180 天。 ## 先给自己定个位 结论先说:过渡机选手动,主力机上自动续期。 |

gitblog_01153的博客 159

核心面试聚焦:业务问题+系统问题+设计题---字节、阿里、美团等整理统计

业务系统及其他相关面试问题整理:线上相关问题排查+高并发系统的限流+高并发秒杀系统设计+负载均衡+一个网站有 20 亿 url 存在一个黑名单中,这个黑名单要怎么存?若此时随便输入一个 url,你如何快速判断该 url 是否在这个黑名单中?并且需在给定内存空间(比如:500M)内快速判断出?

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 172万+

仓颉编程语言入门

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

程小二的博客 4万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

一文带你入门仓颉编程语言(下)

仓颉编程语言,专为 HarmonyOS 精心打造,它宛如一座桥梁,无缝打通了鸿蒙与欧拉在应用开发生态上的阻碍,为鸿蒙生态基础设施建设添上了画龙点睛的最后一笔。从移动应用、智能穿戴,到智能家居、工业控制,鸿蒙系统广泛的应用场景,对编程语言提出了严苛至极的要求。仓颉编程语言应运而生,承载着满足多样化需求、助力开发者高效创新的重任,已然成为鸿蒙生态蓬勃发展的核心驱动力。

倔强的石头的博客 6747

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

华为仓颉编程语言

仓颉编程语言是华为公司自主研发的一款静态强类型、编译型语言,具备高效编程、安全可靠、轻松并发和卓越性能等特点。该语言旨在解决全场景应用开发中的挑战,为开发者提供友好的开发体验和卓越的程序性能。自2019年启动研发以来,仓颉编程语言已经历了五年的沉淀和大量研发投入,目前已正式开启开发者预览版。

了不起的小白君的博客 4174

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

华为仓颉编程语言正式发布,仓颉编程教程

华为在 2024 年 6 月 21 日的华为开发者大会上,华为终端 BG 软件部总裁龚体正式官宣了华为自研仓颉编程语言,并发布了 HarmonyOS NEXT 仓颉语言开发者预览版。仓颉 | 华为开发者联盟仓颉编程语言文件后缀名为.cj你好,仓颉。lambda表达式可以让函数的创建和使用更加灵活,lambda表达式的值就是一个匿名函数仓颉提供了Exception和Error两个类型,用于描述程序运行时的异常行为开发者可以继承Exception或其子类来自定义异常类,但不能继承Error或其子类。

shixuyong的博客 4408

仓颉编程语言在线体验

最近仓颉官网正式上线,仓颉是华为自研仓颉编程语言,本篇做一些仓颉的介绍和编程体验感受。

qq_40306845的博客 2763

华为明年将推出自研编程语言仓颉

9月25日午间消息,在今日的华为全联接大会2021上,华为副总裁、计算产品线总裁邓泰华接受媒体采访。 今日,华为发布了欧拉的全新版本。据悉,OpenEuler与OpenHarmony将能力共享、生态互通。 目前两个操作系统的内核技术已经共享,未来还将在安全OS,编程语言,设备驱动框架,分布式软总线方面能力共享;生态方面,将实现应用生态、设备生态、开发者生态、高校生态上的互通。 邓泰华在采访中表示,华为明年将推出自研的编程语言仓颉,将鸿蒙和欧拉在应用开发生态上进行打通。 实际上,2020年华为就曾..

m0_46163918的博客 1万+

华为仓颉|新一代高性能编程语言

华为公司推出了自有的编程语言——仓颉(Cangjie)。这款语言定位于高性能计算和高安全性应用,旨在解决现代开发中的一系列痛点。小编经过两天的漫长等待后,终于通过审核,拿到了仓颉编译工具。现在华哥就给大家来开箱体验下。仓颉支持多种基本数据类型,包括整数、浮点数、布尔值、字符串等。整数类型:用于表示整数值,可以是有符号或无符号。浮点数类型:用于表示带有小数点的数值。布尔类型:用于表示逻辑真或假。字符串类型:用于表示文本数据。以冒号引出类型定义,这点跟typecript很像。

liyunhua258的博客 5405

华为自研编程语言“仓颉“在HDC 2024首次公开:一文带你了解仓颉语言特性

编程语言的演变从未停止过。在2024年6月23日的华为开发者大会(HDC)上,华为隆重发布了一种全新的编程语言——仓颉语言(Cangjie Language)。旨在提升开发效率和代码的可维护性,特别是为大数据和人工智能应用提供强有力的支持。以满足现代软件开发的高效性、易用性和跨平台兼容性的需求。本文将深入探讨仓颉语言的特点,与主流编程语言进行对比,分析其在各种应用场景中的优势。

qq_42120268的博客 8985
上一篇: 仓颉编程语言:属性
下一篇: 仓颉编程语言:类型转换
懂你的大海
博客等级 码龄6年 9049粉丝 1381原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值