集合和类型系统

集合的概念可以说是非常一般的。很多人都知道。就算不知道,我们也可以在非常短的时间内给他灌输这个概念。为了避免后面饶舌,我现在就先实施灌输:)
集合就是一堆东西。东西就是直觉能区分的个体(康托尔语)。这一堆东西中的每一个都叫做集合的元素。集合中元素的个数叫做集合的阶。全集就是包含全体东西的集合。空集就是没有东西的集合。似乎很简单直觉,其中比较绕的东西我就不提了(如果有兴趣,想想全集的概念,或者想想理发师悖论也行:0),免得大家抓狂。另外,我们还要引入子集的概念。一个集合中,我们取出其中一部分元素(可以是全部,也可以是0个)组成的集合,叫做原集合的子集。子集的阶可以等于原集合,也可以小于。小于的叫做真子集。空集是所有集合的子集,是所有非空集合的真子集。多个集合中的元素,全部拿到一块,把一样的扔了,形成的那个集合叫做着多个集合的交集。多个集合的元素,把相同的取一份留着,其余的全扔了,形成的集合叫做并集。
在基于类的面向对象语言中,一个类定义一个概念,该类的所有对象组成的集合表示这个概念的外延。简单的说,我们认为一个类定义一个集合。
子类(派生类)定义一个父类(基类)所定义集合的真子集。如果我们规定我们的类体系是单根体系,那么可以认为那个最上层的类规定了一个全集。一般的OO语言都有一个null或者类似的对象。它表示空集的元素。由于空集是所有其他非空集合的真子集,所以null是所有集合的成员。总之,我们可以说,继承就是规定一个集合的子集。
向上转型的自动性不会导致类型不安全。原因在前面的对比中已经非常明显了,真子集的元素本来就是原始集合的元素的一部分,所以这个转换是安全的。而向下转型的不安全性也昭然若揭。所以,很少有语言支持自动的向下转型的。null可以给所有类型的对象赋值的原因是空集是所有集合的子集。在这儿要批评一下Java的不一致性,Java中有一个运算符是instanceof,它的左操作数是一个对象,有操作数是一个类型,返回一个布尔类型的对象,如果对象是这个类型的对象,就返回true,否则,返回false。在这儿还一切都正常。可是,一旦我们的左边对象是个null,就不正常了,按照我们上面的分析,如果左边是null,右边无论什么类型,都应该返回true,可Java恰恰相反,返回false。当然是不一致了。不过我们也很明确的知道,这个不一致不会导致太大的问题,我们记住这个特例就是了。这也说明了理论上的问题未必就会导致实际的问题。从理论上讲,理论和实际是一回事。从实践上说,理论是理论,实践跟理论是两码事。
好了,这就是我们原始的OO类型系统,这是一个典型的分类系统。首先是全集,然后分成某些子集,然后再分解,这就是所谓的分类。传统的OO类型系统的基本概念就是分类。
可是,你立即会感觉到有一点不对劲,不安全。是啊,人们对事物的认识总是发展变化的,怎么能保证原来的分类系统就能适应现在的想法呢?更要命的是:我们只能不断的取某些界定的集合的子集,这怎么成?这会导致我们想从两个集合中各取其一部分变得不可能。这时候,一个叫做接口的概念出现了。在类型系统上,它不算什么大事情,它也是个规定了一个概念,它的外延也是一个集合。但是,最要命的事情马上就要出来了。它们允许多继承。回想一下,继承是规定一个集合的子集,多继承呢?规定多个集合的子集?这是个什么概念?规定多个集合的交集(朋友说是着多个集合的笛卡尔积的子集,我觉得更符合逻辑,不过这个子是什么限定呢?另外,这样会引入一个不是原始集合同级的元素)。这是个什么级别的跳跃?初看起来没有什么。仔细想想会下一大跳,妈呀,这个乱呀。是的,至此,清晰的严格的树状分类模型消失了,我们的类型系统变成可以适应认识发展水平的类型系统了,可以横跨任意多个原来规定好的集合,汲取我们想要的那些元素。可以说,一个接口就定义了一个维度。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值