集合的概念可以说是非常一般的。很多人都知道。就算不知道,我们也可以在非常短的时间内给他灌输这个概念。为了避免后面饶舌,我现在就先实施灌输:)
集合就是一堆东西。东西就是直觉能区分的个体(康托尔语)。这一堆东西中的每一个都叫做集合的元素。集合中元素的个数叫做集合的阶。全集就是包含全体东西的集合。空集就是没有东西的集合。似乎很简单直觉,其中比较绕的东西我就不提了(如果有兴趣,想想全集的概念,或者想想理发师悖论也行:0),免得大家抓狂。另外,我们还要引入子集的概念。一个集合中,我们取出其中一部分元素(可以是全部,也可以是0个)组成的集合,叫做原集合的子集。子集的阶可以等于原集合,也可以小于。小于的叫做真子集。空集是所有集合的子集,是所有非空集合的真子集。多个集合中的元素,全部拿到一块,把一样的扔了,形成的那个集合叫做着多个集合的交集。多个集合的元素,把相同的取一份留着,其余的全扔了,形成的集合叫做并集。
在基于类的面向对象语言中,一个类定义一个概念,该类的所有对象组成的集合表示这个概念的外延。简单的说,我们认为一个类定义一个集合。
子类(派生类)定义一个父类(基类)所定义集合的真子集。如果我们规定我们的类体系是单根体系,那么可以认为那个最上层的类规定了一个全集。一般的OO语言都有一个null或者类似的对象。它表示空集的元素。由于空集是所有其他非空集合的真子集,所以null是所有集合的成员。总之,我们可以说,继承就是规定一个集合的子集。
向上转型的自动性不会导致类型不安全。原因在前面的对比中已经非常明显了,真子集的元素本来就是原始集合的元素的一部分,所以这个转换是安全的。而向下转型的不安全性也昭然若揭。所以,很少有语言支持自动的向下转型的。null可以给所有类型的对象赋值的原因是空集是所有集合的子集。在这儿要批评一下Java的不一致性,Java中有一个运算符是instanceof,它的左操作数是一个对象,有操作数是一个类型,返回一个布尔类型的对象,如果对象是这个类型的对象,就返回true,否则,返回false。在这儿还一切都正常。可是,一旦我们的左边对象是个null,就不正常了,按照我们上面的分析,如果左边是null,右边无论什么类型,都应该返回true,可Java恰恰相反,返回false。当然是不一致了。不过我们也很明确的知道,这个不一致不会导致太大的问题,我们记住这个特例就是了。这也说明了理论上的问题未必就会导致实际的问题。从理论上讲,理论和实际是一回事。从实践上说,理论是理论,实践跟理论是两码事。
好了,这就是我们原始的OO类型系统,这是一个典型的分类系统。首先是全集,然后分成某些子集,然后再分解,这就是所谓的分类。传统的OO类型系统的基本概念就是分类。
可是,你立即会感觉到有一点不对劲,不安全。是啊,人们对事物的认识总是发展变化的,怎么能保证原来的分类系统就能适应现在的想法呢?更要命的是:我们只能不断的取某些界定的集合的子集,这怎么成?这会导致我们想从两个集合中各取其一部分变得不可能。这时候,一个叫做接口的概念出现了。在类型系统上,它不算什么大事情,它也是个规定了一个概念,它的外延也是一个集合。但是,最要命的事情马上就要出来了。它们允许多继承。回想一下,继承是规定一个集合的子集,多继承呢?规定多个集合的子集?这是个什么概念?规定多个集合的交集(朋友说是着多个集合的笛卡尔积的子集,我觉得更符合逻辑,不过这个子是什么限定呢?另外,这样会引入一个不是原始集合同级的元素)。这是个什么级别的跳跃?初看起来没有什么。仔细想想会下一大跳,妈呀,这个乱呀。是的,至此,清晰的严格的树状分类模型消失了,我们的类型系统变成可以适应认识发展水平的类型系统了,可以横跨任意多个原来规定好的集合,汲取我们想要的那些元素。可以说,一个接口就定义了一个维度。
分享到:
相关推荐
Oracle数据库系统提供了多种数据类型,其中包括了三种主要的集合数据类型:VARRAY(变量数组)、NESTED TABLE(嵌套表)和 Associative Array(关联数组,也称为INDEX BY TABLE)。这三种集合数据类型在存储和操作一...
【集合类型优化1】这本书主要探讨的是如何在Swift编程语言中高效地实现和优化集合类型,包括数组(array)、集合(set)和字典(dictionary)。作者Károly Lőrentey通过深入讲解各种算法和数据结构,分享了如何...
图标的设计应简洁明了,同时具有足够的辨识度,以便在不同的操作系统和应用环境中都能被用户轻松识别。 在不同的尺寸下,图标需要保持其可读性和识别性。例如,小尺寸的图标可能在桌面或者文件管理器中显示,而大...
在计算机科学中,集合是一种高效且灵活的数据组织方式,它允许存储、检索和操作各种类型的数据对象。这里,集合可能被用来存储DVD的元信息,如标题、导演、演员、发行日期等,方便进行各种操作。 【描述】提到"代码...
通过这个系统,我们可以学习到如何在实际应用中选择合适的集合类型,以及如何设计和实现面向对象的业务逻辑。同时,这也是一个很好的实践案例,帮助初学者理解和掌握Java编程和集合使用的基本技巧。
Java 中的集合类型是指在 Java 语言中用于存储和操作数据的高级数据类型。这些集合类型主要有三种形式:Set(集)、List(列表)、Map(映射)。每种类型的集合都包括三部分:接口、实现和算法。 集合类型的分类 *...
总的来说,内存版系统软件集合是针对特定需求和环境设计的高效工具集,它提供了便捷、快速且轻量级的软件使用体验。对于经常在多台设备间切换工作、追求效率或者希望减少系统维护的用户来说,是一个理想的解决方案。
操作系统是计算机系统中的基础软件,提供了三种类型的使用接口:命令方式、系统调用和图形用户界面。操作系统的主要功能是管理和控制计算机软硬件资源,提供了一个方便用户、管理和控制计算机软硬件资源的系统软件。...
### C# 泛型集合与非泛型集合详解 #### 一、概述 在.NET Framework Class Library (FCL) 中,提供了丰富的集合类型,这些集合类型是...在实际开发过程中,合理选择合适的集合类型对构建高效稳定的应用系统至关重要。
使用泛型集合维护有继承关系的电影票对象 座位数可以在系统中指定 点击座位可购买不同类型的电影票 使用简单工厂模式创建不同类型的电影票 使用多态实现不同类型电影票的价格计算 使用接口实现电影票的打印 使用序列...
在实际应用中,我们经常需要通过Web服务传递集合类型的数据,例如数组或列表,以实现更复杂的数据交互。本实例将深入探讨如何在Web服务中有效地传递集合。 在Web服务中,传递集合通常涉及到以下关键知识点: 1. **...
基数和序数的概念是分析无穷集合大小和结构的基础,基数用于描述集合的势(大小),序数用于描述集合的顺序类型。 序数是集合论中的一个概念,用于描述集合的顺序类型。序数具有传递性和三歧性(即任意两个序数之间...
本文将详细介绍Java中的集合系统,并简要提及JavaScript中的集合概念,帮助读者理解这两种语言中集合的不同之处。 ### Java中的集合框架 Java集合框架是一个用于操作对象集合的标准API,它包含了一系列接口、抽象...
在银行管理系统的业务逻辑中,可能用switch来处理不同类型的交易,如存款、取款、转账等,根据用户输入的交易类型执行相应的处理函数。 break和continue是循环控制语句。break用于立即退出当前循环,继续执行下一次...
IT Tools是一个免费且全面的在线工具集合,为开发人员和IT工作人员提供了极其实用的工具。目前,收录的工具类型包括加密货币、转换器、网络工具、图片视频工具、数学工具等等。这个在线工具集合不仅提供出色的用户...
在Java编程领域,集合框架是核心部分之一,用于存储和管理数据。在这个“java集合练习之超市会员管理系统”项目中,我们重点探讨了如何利用Java集合框架中的HashMap类来实现一个简单的超市会员管理功能。HashMap是一...
学习C#集合时,开发者需要熟悉这些泛型集合的接口、属性和方法,以便在实际开发中选择合适的集合类型来满足特定需求。例如,如果需要快速查找元素,哈希集和字典可能更适合;如果需要保持元素的顺序,列表和双向链接...
传统卡尔曼滤波假设系统和观测都是线性的,而EnKF则通过构建样本集合来处理非线性问题,它将状态估计转化为统计推断的问题,通过集合成员的平均和协方差来逼近真实状态的后验概率分布。 在压缩包的"Analysis"子...
这确保了集合内的所有元素都是同一类型,从而避免了类型检查和装箱/拆箱操作,提高了效率和安全性。泛型接口`IEnumerable<T>`和`IList<T>`定义了遍历和操作这些集合的标准方式。 在多线程编程中,当多个线程访问...