【发布时间】:2015-05-26 11:34:24
【问题描述】:
我试图想一个很好的例子来详细说明 Ada 的严格类型和 Java 的强类型之间的区别。 有没有人有一个很好的例子来识别使用基于整数的值在类型转换中的这些差异?
【问题讨论】:
标签: java type-conversion ada
我试图想一个很好的例子来详细说明 Ada 的严格类型和 Java 的强类型之间的区别。 有没有人有一个很好的例子来识别使用基于整数的值在类型转换中的这些差异?
【问题讨论】:
标签: java type-conversion ada
从 Ada 的角度来看,这可能会有所帮助。
类型声明有两种基本形式:新类型和子类型。
一个新类型被认为是与任何以前的类型完全不同的类型,即使它具有相同的取值范围。新类型的对象只能赋值给新类型的变量,以此类推。
子类型派生自现有类型,共享其值的子集,并且就赋值而言被视为本质上相同的类型。
使用类型系统的艺术需要一点练习,而这——在类型和子类型之间进行选择——是一个重要的领域。它在与类型系统作斗争和让程序简单而轻松地组合在一起之间有所不同。
一个例子:想象一个建筑物的自动化,包括它的电梯系统:
type Floor is new Integer range -3 ..135;
有几个地下车库,一个地下室,0 是底层(对于欧洲而不是美国的建筑!),上面有 135 层,比高耸的地狱高一层。
这可以安全地成为一种新类型,因为将 Floor 变量与其他任何变量混淆的危险很小,并且很少需要将 Floor 与任何其他数量进行数学组合。电梯需要去那里,仅此而已。 在这种情况下,将 Floor 作为一种新类型可以捕获一些错误,但增加的安全性是值得的,没有痛苦的前景。
使用类型或子类型作为数组索引和循环边界是一种避免越界访问的好方法。
Array(Floor) of ...
for f in Floor loop ...
如果您确实需要将整数变量分配给 Floor,则类型转换会向编译器和读取代码的任何人发出信号,表明这是有意的。
subtype Population is Natural range 0 .. 10000;
我们必须知道有多少人占用了大楼,用于安全、消防安全、供暖或制冷需求以及其他目的。它的范围在两端都有严格的限制:对于这座建筑,假设有超过 10000 名居住者被消防安全法规禁止。
基本类型是 Natural(它本身是 Integer 的子类型)而不是 Integer,因为总体永远不会小于零。
但将 Population 设为新类型可能会导致无穷无尽的类型转换问题。将其设为子类型可以更轻松地在热负荷计算、电梯调度策略、用水预测等中使用人口。
它是一个子类型而不仅仅是 Integer 的事实仍然提供了有用的保护形式;虽然整数可以分配给人口变量并在表达式中与它们混合,但任何分配超出范围值的尝试都将被标记为错误。如果在编译时无法检测到它们,它们将在运行时引发异常。试图进入大楼的第 10001 人也将如此。
我会让 Java 专家解释在 Java 中实现这些策略的最佳方法。
【讨论】: