仓颉编程语言:泛型约束

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

泛型约束的作用是在函数、class、enum、struct 声明时明确泛型形参所具备的操作与能力。只有声明了这些约束才能调用相应的成员函数。在很多场景下泛型形参是需要加以约束的。以 id 函数为例:

func id<T>(a: T) {
    return a
}

我们唯一能做的事情就是将函数形参 a 这个值返回,而不能进行 a + 1,println("${a}") 等操作,因为它可能是一个任意的类型,比如 (Bool) -> Bool,这样就无法与整数相加,同样因为是函数类型,也不能通过 println 函数来输出在命令行上。而如果这一泛型形参上有了约束,那么就可以做更多操作了。

约束大致分为接口约束与子类型约束。语法为在函数、类型的声明体之前使用 where 关键字来声明,对于声明的泛型形参 T1, T2,可以使用 where T1 <: Interface, T2 <: Type 这样的方式来声明泛型约束,同一个类型变元的多个约束可以使用 & 连接。例如:where T1 <: Interface1 & Interface2。

例如,仓颉中的 println 函数能接受类型为字符串的参数,如果我们需要把一个泛型类型的变量转为字符串后打印在命令行上,可以对这个泛型类型变元加以约束,这个约束是 core 中定义的 ToString 接口,显然它是一个接口约束:

package core // `ToString` is defined in core.

public interface ToString {
    func toString(): String
}

这样我们就可以利用这个约束,定义一个名为 genericPrint 的函数:

func genericPrint<T>(a: T) where T <: ToString {
    println(a)
}

main() {
    genericPrint<Int64>(10)
    return 0
}

结果为:

10

如果 genericPrint 函数的类型实参没有实现 ToString 接口,那么编译器会报错。例如我们传入一个函数做为参数时:

func genericPrint<T>(a: T) where T <: ToString {
    println(a)
}

main() {
    genericPrint<(Int64) -> Int64>({ i => 0 })
    return 0
}

如果我们对上面的文件进行编译,那么编译器会抛出泛型类型参数与满足约束的错误。因为 genericPrint 函数的泛型的类型实参不满足约束 (Int64) -> Int64 <: ToString。

除了上述通过接口来表示约束,还可以使用子类型来约束一个泛型类型变元。例如:当我们要声明一个动物园类型 Zoo<T>,但是我们需要这里声明的类型形参 T 受到约束,这个约束就是 T 需要是动物类型 Animal 的子类型, Animal 类型中声明了 run 成员函数。这里我们声明两个子类型 Dog 与 Fox 都实现了 run 成员函数,这样在 Zoo<T> 的类型中,我们就可以对于 animals 数组列表中存放的动物实例调用 run 成员函数:

import std.collection.*

abstract class Animal {
    public func run(): String
}

class Dog <: Animal {
    public func run(): String {
        return "dog run"
    }
}

class Fox <: Animal {
    public func run(): String {
        return "fox run"
    }
}

class Zoo<T> where T <: Animal {
    var animals: ArrayList<Animal> = ArrayList<Animal>()
    public func addAnimal(a: T) {
        animals.append(a)
    }

    public func allAnimalRuns() {
        for(a in animals) {
            println(a.run())
        }
    }
}

main() {
    var zoo: Zoo<Animal> = Zoo<Animal>()
    zoo.addAnimal(Dog())
    zoo.addAnimal(Fox())
    zoo.allAnimalRuns()
    return 0
}

程序的输出为:

dog run
fox run

最后

有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)资料用来跟着学习是非常有必要的。 

这份鸿蒙(HarmonyOS NEXT)资料包含了鸿蒙开发必掌握的核心知识要点,

内容包含了:(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、OpenHarmony南向开发、鸿蒙项目实战等等)鸿蒙(HarmonyOS NEXT)技术知识点。

希望这一份鸿蒙学习资料能够给大家带来帮助,有需要的小伙伴自行领取,限时开源,先到先得~无套路领取!!

如果你是一名有经验的资深Android移动开发、Java开发、前端开发、对鸿蒙感兴趣以及转行人员,可以直接领取这份资料

 获取这份完整版高清学习路线,请点击关注 → 公众皓 :【蜀道衫】即可领取

鸿蒙(HarmonyOS NEXT)最新学习路线

  •  HarmonOS基础技能

  • HarmonOS就业必备技能 
  •  HarmonOS多媒体技术

  • 鸿蒙NaPi组件进阶

  • HarmonOS高级技能

  • 初识HarmonOS内核 
  • 实战就业级设备开发

有了路线图,怎么能没有学习资料呢,小编也准备了一份联合鸿蒙官方发布笔记整理收纳的一套系统性的鸿蒙(OpenHarmony )学习手册(共计1236页)与鸿蒙(OpenHarmony )开发入门教学视频,内容包含:ArkTS、ArkUI、Web开发、应用模型、资源分类…等知识点。

获取以上完整版高清学习路线, 请点击关注 → 公众皓 :【蜀道衫】即可领取

《鸿蒙 (OpenHarmony)开发入门教学视频》

​

《鸿蒙生态应用开发V2.0白皮书》

图片​

《鸿蒙 (OpenHarmony)开发基础到实战手册》

OpenHarmony北向、南向开发环境搭建

图片​

 《鸿蒙开发基础》

  • ArkTS语言
  • 安装DevEco Studio
  • 运用你的第一个ArkTS应用
  • ArkUI声明式UI开发
  • .……

图片​

 《鸿蒙开发进阶》

  • Stage模型入门
  • 网络管理
  • 数据管理
  • 电话服务
  • 分布式应用开发
  • 通知与窗口管理
  • 多媒体技术
  • 安全技能
  • 任务管理
  • WebGL
  • 国际化开发
  • 应用测试
  • DFX面向未来设计
  • 鸿蒙系统移植和裁剪定制
  • ……

图片​

《鸿蒙进阶实战》

  • ArkTS实践
  • UIAbility应用
  • 网络案例
  • ……

图片​

总结

总的来说,华为鸿蒙不再兼容安卓,对中年程序员来说是一个挑战,也是一个机会。只有积极应对变化,不断学习和提升自己,他们才能在这个变革的时代中立于不败之地。 


 看完三件事❤️

  • 如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
  • 关注作者公众皓 『 蜀道衫 』,不定期分享原创知识。
  • 关注后回复【666】扫码即可获取学习资料包。
  • 同时可以期待后续文章ing🚀。

​

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

相关推荐

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

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

一键难忘的博客 3076

C#泛型与约束

前言 最近在看一些项目和框架,用了好多泛型,虽然C++模板比较熟,但是泛型却接触的比较少,所以看了CLR的泛型后打算写个文章记录下方便以后自己看。(其实和模板差不多!) 泛型 介绍 泛型是CLR和编程语言提供的一种特殊机制,它支持另一种形式的代码重用,也就是算法重用,比如泛型List类的List< T >表名它操作的是一个未指定的数据类型,到时候使用泛型类型或者方法时指定的具体数据类型称为类型实参,也就是用具体的类型实参来代替T 优点 源代码保护,开发人员不需要访问算法的源代码,而模板编程需要

白小飞 835

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

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

一键难忘的博客 1957

什么是泛型约束?

泛型约束的作用是提供更精确的类型控制和更强的类型安全性。通过约束泛型类型参数,我们可以在编译时捕获错误,并防止不合适的类型被传递给泛型代码。这样,泛型类型参数就会被限制为必须是指定类型或其子类型。在使用泛型方法时,我们传递了一个整数数组和一个字符串数组作为参数,并分别获取了最大的整数和最大的字符串。通过使用泛型约束,我们可以确保只有符合特定条件的类型才能被传递给泛型代码,从而提高代码的可靠性和安全性。接口的类型数组,并返回数组中最大的元素。使用泛型约束的语法是在泛型类型参数后面使用。必须是可比较的类型。

dxn16638400024的博客 594

仓颉泛型类型参数与约束深度解析

本文系统阐述了仓颉语言的泛型系统设计,重点探讨了泛型类型参数与约束机制。文章首先分析了泛型的本质与价值,指出其通过类型抽象实现代码复用、类型安全和性能优化。随后详细介绍了基础泛型类型参数的语法和使用场景,包括泛型类和泛型函数的实现。文章深入讲解了类型约束的必要性及其实现方式,展示了接口约束、多重约束和类型继承约束等模式。最后,作者介绍了关联类型约束、递归类型约束等高级模式,体现了仓颉类型系统的强大表达能力。全文通过丰富代码示例,系统呈现了仓颉泛型的设计理念和实践技巧。

超哥的博客 674

Spring Authorization Server自定义密码模式:突破标准OAuth2限制,实现MFA与复杂业务集成

OAuth 2.0授权框架是构建现代应用安全体系的基石,其密码模式(Resource Owner Password Credentials Grant)提供了一种直接的资源所有者凭证交换令牌的机制。该模式的核心原理是客户端收集用户密码并直接向授权服务器请求访问令牌,适用于受信任的客户端场景。在技术价值上,它简化了某些传统应用的OAuth集成流程。然而,标准实现往往难以满足复杂的现实业务需求,例如需要集成多因素认证(MFA)、对接外部LDAP目录服务或执行自定义密码加密校验等场景。Spring Authori

weixin_34302561的博客 438

泛型及泛型约束-小结

8.泛型 泛型约束    泛型:作用是“代码重用”,用于“算法重用”。CLR允许创建泛型引用类型和泛型值类型,但不允许创建泛型枚举类型,还可以创建泛型接口和泛型委托。    原则:泛型参数变量为T,或者以T开头(如TKey TValue),类似于接口I的原则;8.1 泛型    泛型最常见的应用是集合类。8.2 泛型约束    参考:https://docs.microsoft.com/zh-cn...

rainy days 2937

无网环境也能玩转DBeaver?手把手教你离线安装与ClickHouse连接(附实测jar包)

本文详细介绍了在无网环境下如何离线安装DBeaver并配置ClickHouse连接的完整指南。通过准备必备工具如DBeaver安装包、ClickHouse JDBC驱动及Maven本地仓库,确保在物理隔离环境中实现数据库管理。文章包含详细的安装步骤、驱动配置和性能优化建议,帮助开发者在严格网络限制下高效工作。

weixin_42635064的博客 376

c#泛型约束

泛型约束的使用以及可作用场景

LM001_csdn的博客 2724

Comsol 压电换能器声场仿真(远场分析、边界元法优化)

本文详细介绍了在Comsol中使用边界元法进行压电换能器远场声场仿真的高效方法。针对传统有限元法计算远场时内存消耗大、耗时长的问题,文章阐述了边界元法在处理无限域、提升计算效率和精确获取远场指向性方面的核心优势,并提供了从多物理场耦合设置、网格划分策略到求解器配置及结果验证的完整实战指南。

weixin_29045585的博客 408

Scratch(四十一):升级版垃圾分类

哈喽,大家好!之前给大家展示过“Scratch(二十四):垃圾分类”。今天呢,给大家展示的Scratch是`升级版垃圾分类`。接下来,我们一起看一下效果吧。

我可以很大侠的博客 6871

仓颉编程入门 -- 泛型概述 , 如何定义泛型函数

在仓颉编程语言中,泛型指的是参数化类型,参数化类型是一个在声明时未知并且需要在使用时指定的类型。类型声明与函数声明可以是泛型的。最为常见的例子就是 Array、Set 等容器类型。以数组类型为例,当使用数组类型 Array 时,会需要其中存放的是不同的类型,我们不可能定义所有类型的数组,通过在类型声明中声明类型形参,在应用数组时再指定其中的类型,这样就可以减少在代码上的重复。在仓颉中,class、interface、struct 与 enum 的声明都可以声明类型形参,也就是说它们都可以是泛型的。

几许的博客 829

知识图谱:综述

第一种理解:知识图谱本质上是语义网络。本体论是语义网络中最重要的一个要素。第二种理解:知识图谱也叫做多关系图,由多种类型的节点和多种类型的边组成。课程以第二种理解为主。

u013250861的博客 480

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

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

Huang兄 958

基于STM32单片机智能循迹小车毕业设计

本文介绍了一种利用STM32F103C8T6单片机为控制核心,结合多种传感器以及PID算法实现循迹避障功能的智能小车。随着我国高科技水平的不断提高和工业自动化进程的不断推进,智能小车被广泛应用于各种玩具和其他产品的设计中,极大地丰富了人们的生活。本次设计利用反射式红外光电传感器探测路面黑线实现小车循迹,利用超声波测距传感器探测路径上的障碍,控制小车自动避障,整个系统具有自动循迹、自动避障、速度检测和无线遥控功能。其中,控制部分采用STM32F103C8T6单片机,STM32F103C8T6单片机是一

qq_48771816的博客 3975

神经进化实践:用遗传算法替代反向传播优化神经网络

神经进化用来定义应用于深度学习的特定优化模式。在本节中,我们通过遗传算法优化简单深度学习网络的权重/参数,替换在误差反向传播训练过程中的所用优化器。

盼小辉丶的博客 3652

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

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

qq_55750963的博客 891

十二种嵌入式通信协议

嵌入式通信协议选型核心要点解析 在嵌入式系统开发中,通信协议选型直接影响项目成败。本文系统梳理了12种主流协议,从三个维度提供选型指南: 板级通信协议: I²C:双线制,适合传感器连接(温湿度、RTC等) SPI:高速全双工,适用于Flash存储、TFT屏等 UART:异步串行,常用于调试日志输出 总线通信协议: CAN:汽车电子首选,支持多主节点和硬件仲裁 LIN:低成本单线方案,适用于车窗控制等场景 RS485:工业自动化主力,最长传输距离1200米 Modbus:工业领域通用协议,支持RTU/TCP格

qq_37999850的博客 253

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

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

华为云官方博客 1885

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

仓颉泛型系统探析:类型参数与约束

*泛型参数 (<T>) 提供了构建可复用代码的“抽象”能力。泛型约束 (where ...则是我们向编译器提供的“证明”。这套体系,让仓颉在享受高层抽象(如函数式编程、mapfilter)的同时,通过编译期的严格检查和“泛型特化”优化,保留了媲美 C/C++ 的底层性能。它完美地平衡了“安全”、“效率”和“表达力”这三者的关系。

2503_94027378的博客 687

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

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

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

计算机毕业论文源码,学生个人网页制作html源码。贴近用户做网络推广和互联网优化。 916

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

仓颉编程(20)泛型

在仓颉编程语言中,泛型指的是参数化类型,参数化类型是一个在声明时未知并且需要在使用时指定的类型。简单来说,泛型允许我们在定义类型或函数时使用类型参数,而不是绑定到具体某个类型。这种机制使得代码更加通用化,可以在类型定义中使用类型参数。泛型的核心价值在于代码复用。以数组为例,由于我们可能需要在数组中存储多种不同类型的数据,因此不可能为每种数据类型都定义一个专门的数组类型。

sucker的博客 1076

仓颉编程(16)泛型类型

在仓颉编程语言中,泛型指的是参数化类型,参数化类型是一个在声明时未知并且需要在使用时指定的类型。简单来说,泛型允许我们在定义类型或函数时使用类型参数,而不是绑定到具体某个类型。这种机制使得代码更加通用化,可以在类型定义中使用类型参数。泛型的核心价值在于代码复用。以数组为例,由于我们可能需要在数组中存储多种不同类型的数据,因此不可能为每种数据类型都定义一个专门的数组类型。

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值