读编程与类型系统笔记07_子类型

如何使用ArcGIS自动矢量化建筑 在显示的重分类对话框内,输入栅格选择提取单波段后的栅格,重分类分为三个层级,旧值分别为100-249、250-251和252-255,对应新值为1、2和3,旧值的最小和最大值不用修改,保持和原有的一致。同样在ArcToolbox内点击Spatial Analyst工具点击“重分类\重分类”,在重分类对话框内输入栅格选择之前重分类过后的图片,将旧值3的新值设置为1,这样分类后就只有两类。在显示的新建Shapefile对话框内,名称命名为折线,要素类型选择折线,点击编辑,设置坐标系为WGS 1984。 阅读详情

 

1. 子类型

1.1. 在期望类型T的实例的任何地方,都可以安全地使用类型S的实例,则类型S是类型T的子类型

1.1.1. 里氏替换原则(Liskov substitution principle)

2. 名义子类型

2.1. 明确指定

2.2. 显式声明一个类型是另一个类型的子类型

2.3. 大部分主流编程语言采用的方式

2.3.1. Java

2.3.2. C#

2.4. TypeScript通过使用unique symbol可以模拟名义子类型

3. 结构子类型

3.1. 类型具有相同的结构

3.2. 不需要显式声明子类型关系

3.3. 一个类型的结构与另一个类型相似(具有相同的成员,可能还有额外的成员),自动被视为后者的子类型

3.4. TypeScript使用结构子类型

3.5. 即使类型不在我们的控制范围内,我们在类型之间仍然能建立关系

3.5.1. 例如:我们不能修改的来自外部库的一个类型

4. 极端情况

4.1. 顶层类型

4.1.1. 把任何东西赋值给它的类型

4.1.1.1. 用来存储任何东西

4.1.1.2. C#的Object

4.1.1.3. TypeScript的unknown

4.1.1.3.1. null的类型是null

4.1.1.3.2. undefined的类型是undefined

4.1.1.3.3. Object

4.1.1.3.4. 三者和类型即unknown

4.1.1.3.4.1. Object | null |undefined

4.1.1.3.5. 只有当我们确认一个值具有某个类型时,才能把该值用作该类型

4.1.1.3.5.1. C#提供了is关键字

4.1.1.3.5.2. Java则提供了instanceof

4.1.2. 其他任何类型的父类型

4.1.3. 位于子类型层次结构的顶端

4.2. 底层类型

4.2.1. 可以赋值给任何东西的类型

4.2.1.1. 没有某种类型的实例可用

4.2.1.2. TypeScript的never

4.2.2. 其他任何类型的子类型

4.2.3. 位于子类型层次结构的底端

4.2.4. 始终是一个空类型:这是我们不能为其创建实际值的类型

4.2.5. 允许我们假装有任何类型的一个值,即使我们并不能生成这个值

4.2.6. 很少有主流语言提供底层类型

4.2.6.1. 使一个类型成为空类型,但不能使其成为底层类型

4.2.6.2. 除非在编译器中实现,否则我们无法自定义底层类型

5. 和类型

5.1. 父类型比子类型的类型更多

5.1.1. 例如:Triangle | Square是Triangle | Square | Circle的子类型

5.2. Variant能够封装几个类型中某个类型的值,但是它本身不是其中任何一个类型

6. 可变性

6.1. 协变性

6.1.1. 一个类型保留其底层类型的子类型关系

6.1.2. 数组具有协变性,因为它保留了子类型关系

6.1.3. 当处理集合(如LinkedList)时,不同的语言具有不同的行为

6.1.3.1. 在C#中,必须通过声明接口并使用out关键字(ILinkedList),显式指出一个类型(如LinkedList)的协变

6.1.4. 函数的返回类型具有协变性

6.2. 逆变性

6.2.1. 一个类型颠倒了其底层类型的子类型关系

6.2.2. 大部分编程语言中,函数的实参是逆变的

6.2.2.1. TypeScript是一个例外

6.2.2.1.1. 故意做出的设计决策

6.3. 双变性

6.3.1. 类型的底层类型的子类型关系决定了它们互为子类型

6.3.2. 在TypeScript中函数实参的双变性可能导致错误的代码通过编译

6.4. 不变性

6.4.1. 一个类型不考虑其底层类型的子类型关系

6.4.2. C#中的List具有不变性

7. any类型

7.1. 可以把任何值赋值给any

7.2. 可以把any值绕过类型检查赋值给其他任何类型

7.3. 会绕过类型检查立即把该值用作其他任何类型的值

CANoe_Demo_下载以及安装教程 CANoe Demo下载安装流程 阅读详情

相关推荐

不止是打字机效果:手把手教你用SpannableStringBuilder打造Android富文本AI对话界面

本文详细介绍了如何使用SpannableStringBuilder在Android平台上构建专业级AI对话界面,涵盖流式文本处理、富文本解析、交互优化等核心技术。通过实战代码示例,帮助开发者实现类似DeepSeek的AI产品交互效果,提升用户体验和应用专业度。

weixin_28358083的博客 199

编程与类型系统读后总结与感想

不论类型是否常见,讲其然,也讲其所以然。个人觉得比较重要的类型如下:空类型单元类型可选类型和类型Either类型变体类型。

lyingSeven的博客 137

dpdk 源码分析 rte_ring

rte_ring源码分析

qq_40843445的博客 929

读编程与类型系统笔记01_类型简介

1999年发射的火星气候探测者号(Mars ClimateOrbiter)进入火星轨道的过程中失去联络。运行时错误转换成编译时错误,能够使代码更容易维护、适应性更强。如果为这两种测量结果使用不同的类型,本可以避免这场灾难。强度在一个范围内:执行的隐式转换越多,该类型系统就越弱。限制变量能够取到的值的数量,从而减小状态空间。0视为false,将其他任意数字视为true。优秀的软件设计和行为的根本特性。确保程序遵守类型系统的规则。8位整数转换为16位整数。

lyingSeven的博客 157

Yocto下载加速秘籍:用清华镜像+PREMIRRORS配置让构建速度翻倍

本文详细解析了如何通过配置Yocto的PREMIRRORS优先级策略,并利用清华大学等国内镜像源,显著加速构建过程中的源码下载。文章提供了具体的配置示例和验证方法,帮助开发者解决网络瓶颈,实现构建速度翻倍,提升开发效率。

game4的博客 276

学习心得——COMSOL Multiphysics with MATLAB联合仿真及寻优计算

学习心得——COMSOL Multiphysics with MATLAB联合仿真及寻优计算

weixin_41678956的博客 8658

Programming Languages PartC Week3学习笔记——子类型(Subtyping)的讨论

Programming Languages PartC Week3学习笔记——子类型(Subtyping)的讨论

df1445的博客 656

ESXI添加硬盘时提示 无法创建 VMFS 数据存储 - 无法更改主机配置

ESXI添加硬盘时提示 无法创建 VMFS 数据存储 - 无法更改主机配置1.打开ESXI的SSH2.找到不能添加的硬盘路径3.用SSH操作 1.打开ESXI的SSH 2.找到不能添加的硬盘路径 我的是第一个,找到你要添加但是不能添加的那个硬盘,点进去。 完整的路劲为:1/2 比如我的: /vmfs/devices/disks/t10.ATA_____ST500LT0122D1DG142___________________________________S3PHRNHQ (比较长哈!) 3.用SSH

AI_DOG的博客 2万+

读编程与类型系统笔记11_高级类型及其他

对于任何泛型类型,以Box为例,如果map()操作接受一个Box和一个从T到U的函数作为实参,并得到一个Box,那么该map()就是一个函子。TypeScript、C#或Java中没有一种好的方式来表达高阶类型,所以我们不能通过使用类型系统表达一个函子的方式来定义结构。范畴论是数学的一个分支,研究的是由对象及这些对象之间的箭头组成的结构。T或Box有一个类型参数T,后者又有一个类型参数U。在Box上应用函数T => Box,返回一个Box

lyingSeven的博客 196

QT+Halcon实现螺纹检测

工业上要检测螺丝的内外直径、内外牙距、内外角度,现在比较好用的图像处理库,开源的opencv,收费的有halcon。为了实现螺纹检测,和对比螺纹检测拿个库比较好。分别用opencv和halcon实现了螺纹检测,通过对比发现用halcon实现的效果比较。现在用博客把实现过程记录下来: 1、需要检测的螺纹数据如下: 2、为了实现检测螺丝以上数据,螺纹内径、螺纹外径、螺纹外牙距、螺纹...

专注现代C++实战,从核心语法到高性能编程,助力开发者深入掌握系统级编程精髓。 7051

(10)三相三绕组变压器的建模仿真

建立了三相三绕组变压器组的Simulink仿真模型,通过实例进行了仿真计算。

weixin_45670943的博客 1143

《TypeScript编程》学习笔记

程序运行过程:1.把程序解析为AST。2.AST编译成字节码。3.运行时计算字节码。TypeScript编译器生成AST之后,真正运行代码之前,TypeScript会对代码做类型检查(检查代码是否符合类型安全要求的特殊程序)。// 函数细化了参数的类型,而且返回一个布尔值,可以使用类型防护措施确保类型的细化能在作用域之间转移,在使用该函数的任何地方都起作用。

Leon_Chenl的博客 1151

C#串口通信从入门到精通(27)——高速通信下解决数据处理慢的问题(20ms以内)

本文介绍如何在高速通信情况下解决串口接收的数据来不及处理的问题,由高级工程师多年经验总结而成,绝对是串口领域的实战经验!

qq_34059233的博客 6811

读编程与类型系统笔记04_类型安全

正确使用时,强制转换是一种很强大的技术,允许我们改进值的类型。把值声明为基本类型,并对其意义做一些隐含的假定时。定义类型来显式捕捉值的含义,从而避免错误解释值。类型检查器忘记了我们在赋值时提供的类型。如:8位无符号整数转为16位无符号整数。基本类型不允许我们直接施加某些限制。构造函数不应该做太繁重的工作。在运行时存储额外的类型信息。在类型系统之外跟踪类型。

lyingSeven的博客 146

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

jre9下载 jdk9

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

Unity3D脚本编程读书笔记——第3章 Unity 3D 脚本语言的类型系统

本文的核心是对C#编程语言进行介绍,主要是从C#的类型系统(对应C#1的主要特性)下手。从本章开始我们也正式开始了对Unity C#脚本编程的真正的核心内容的学习。

xcinkey的博客 3051

OV9734 DATASHEET,完整规格书

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

读编程与类型系统笔记08_面向对象变成的元素

不是把几个组件合并到一起,而是封装一个组件,并提供它需要的“胶水”代码,使其能够作为另外一种类型使用。与继承不同,使用混入时,我们为不同的行为方面定义不同的类型,然后把它们合并起来,放到一个完整的类型中。除非两个类型之间存在清晰的“是一个”关系,否则组合是可以默认使用的好方法。合并接口的能力允许我们从较小的、可重用的接口创建合并后的接口。让子类是具体类,让层次结构上方的父类是抽象类,这是一个好主意。不修改类型,而是使用封装和组合让类型适配不同接口的一个例子。接口最终让消费者受益,而不是让实现接口的类获益。

lyingSeven的博客 135

读编程与类型系统笔记03_组合

组合一个或多个类型将得到一个新类型,其值为组成类型的全部可能的组合

lyingSeven的博客 160

构建个人编程学习的知识宝库:高效笔记记录与整理策略

在编程的广阔天地中,我们如同探险者,不断探索未知的领域。随着技术的飞速发展,新的编程概念、工具和框架层出不穷,使得我们的知识库需要不断地更新和扩展。然而,在这片知识的海洋中,如果没有一张清晰的航海图,我们很容易迷失方向,错过重要的知识点,甚至在复习时感到困惑和无从下手。高效的笔记记录和整理,正是这样一张航海图,它能够帮助我们在学习过程中捕捉关键信息,构建起一个系统化的知识框架。这不仅能够提高我们的学习效率,还能在我们需要回顾和深入理解某个概念时,提供快速的途径。

从事移动开发八年,csdn博客专家,阿里云特邀专家,华为云云享专家,高级网络信息安全工程师,大数据工程师(高级),python技术开发(高级),HarmonyOS 应用开发者高级认证,现在某学校任教。 2万+

【编程笔记】Unity3D语言的类型系统--C#的类型系统

  几乎所有的编程语言都有自己的类型系统。   而编程语言更是常常按照其类型系统而被分为强类型语言/弱类型语言、安全类型语言/不安全类型语言、静态类型语言/动态类型语言等。   而C#的类型系统是静态、安全,并且在大多数时候是显示的;   C#要求其所有类型全部从System.Object类派生。无论是开发者自己定义的类型、还是C#所提供的类型。   下面两种定义类型的方式...

Fling1210的博客 168

《Linux 源码趣读》学习

《Linux 源码趣读》学习

青少年趣味编程 2721

TypeScript学习笔记(二) 类型系统详解

大家好,我是半虹,这篇文章来讲 TypeScript 中的类型系统

半虹小站 1260

编程学习之旅:高效记录与整理笔记的艺术

在笔记中,关键词的提取与高亮也是非常重要的。例如,在记录一个算法实现的笔记时,我们可以将算法的名称、时间复杂度、空间复杂度等关键词进行高亮处理,以便在后续的学习中快速回顾和比较不同算法的性能特点。在编程的浩瀚星空中,每一位学习者都像是勇敢的航海家,驾驶着知识的帆船,在无尽的信息海洋中探索未知的领域。在编程学习中,一个清晰、有逻辑的笔记结构,就像是一座稳固的金字塔,为我们的知识体系提供坚实的支撑。在编程学习的征途中,选择一款合适的笔记工具,就像是选择一张精准的航海图,对于我们的学习和成长至关重要。

Geektec的专栏 1296

学习编程用什么做笔记比较好?

本文介绍一个白板与制图为一体的工具,辅助进行程序阅读和程序设计。工具类似在一个大白板面前,逐步整理碎片化的信息和理解,最后形成一个整体视图。这个是更加适合思维习惯的笔记方式,更加适合开放与探索性的工作,尤其是程序工作者。

u011593466的博客 820

读编程与类型系统笔记05_函数类型

8.2.2.4.2.1.1. 接受一个实参并返回一个boolean的函数。可以传递函数而不是传递实际的值,并在需要值的时候调用这些函数。接受一个或多个非函数实参并返回一个非函数类型的“标准”函数。将函数赋值给变量,并像处理类型系统中的其他值一样处理它们。状态和转移作为一个单独的枚举进行维护,有不同步的风险。该实参函数接受项目T作为实参,并返回U类型的一个值。函数的实参类型和返回类型决定了函数的类型。两个函数接受相同的实参,并返回相同的类型。定义:把所有接受或返回其他函数的函数。

lyingSeven的博客 154

Kotlin学习笔记二:Kotlin的类型系统

Kotlin的类型系统 基本数据类型和其他基本类型 Java把基本类型和引用类型区分开,基本类型存值,引用类型存地址,还提供了基本类型的包装类型,比如:Integer等。Kotlin并不区分基本类型和引用类型,用的全是一个类型。 val i: Int = 1 val list: List<Int> = listOf(l, 2, 3) 上面的 i 在最后会编译成Java的int, 对于...

苟浩的博客 546

读《Unix编程艺术》笔记

转载至:http://blog.youkuaiyun.com/byxdaz/article/details/4847605。 读《Unix编程艺术》笔记 (一)  1)行为的最终逻辑被尽可能推后到使用端;    2)最终用户永远比操作系统设计人员更清楚他们究竟需要什么;    3)用错误的方式解决正确的问题 总比用正确的方法解决错误的问题好;      注:正确提出问题等于正确解决问题的

三界:天地人(xgfone)的专栏 1140

【数据结构】基于比较的排序算法 - 交换排序

本文介绍交换排序中的冒泡排序与快速排序。冒泡排序通过相邻元素比较交换,实现升序,时间复杂度最坏为O(N²),空间复杂度O(1),稳定且适合小规模有序数据。快速排序采用分治思想,以基准值划分区间,平均时间复杂度O(N log N),空间复杂度O(log N),但不稳定,实际应用中性能优异,可通过随机基准、小区间优化等提升效率。

careathers的博客 362
上一篇: 读编程与类型系统笔记06_函数类型的高级应用
下一篇: 读编程与类型系统笔记08_面向对象变成的元素
躺柒
博客等级 码龄4年 7004粉丝 1321原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值