详细说明 Ada 和 Java 之间输入差异的示例代码

Example code detailing difference in typing between Ada and Java

我正在想一个很好的例子来详细说明 Ada 的严格类型和 Java 的强类型之间的区别。 有没有人有一个很好的例子来使用基于整数的值来识别类型转换中的这些差异?

从 Ada 的角度来看,这可能会有所帮助。

类型声明有两种基本形式:新类型和子类型。

新类型被视为与任何先前类型完全不同的类型,即使它具有相同的取值范围。新类型的对象只能赋值给新类型的变量,依此类推

子类型派生自现有类型,共享其值的子集,并且就赋值而言被视为本质上相同的类型。

使用类型系统的艺术需要一些练习,而这——在类型和子类型之间进行选择——是一个重要的领域。它使沮丧地与类型系统作斗争和让程序简单轻松地组合在一起之间有所不同。

  • 声明一个新类型,它的值表示一些新的东西,一些东西 您不需要或不想与其他数量混合。
  • 声明一个子类型,其值与现有事物相关。

举个例子:想象一下自动化建筑,包括它的电梯系统:

type Floor is new Integer range -3 ..135;

有几个地下车库,一个地下室,0 是底层(欧洲建筑而不是美国建筑!),上面有 135 层,比 Towering Inferno 高一层。

这可以安全地成为一种新类型,因为将 Floor 变量与其他任何东西混淆的危险很小,并且很少需要在数学上将 Floor 与任何其他量组合。电梯需要去那里,仅此而已。 在这种情况下,将 Floor 作为一种新类型可以捕获一些错误,但增加的安全性是值得的,而且不会带来痛苦。

使用类型或子类型作为数组索引和循环边界是减少越界访问的好方法。

Array(Floor) of ...
for f in Floor loop ...

如果您确实需要将整型变量赋值给 Floor,则类型转换会向编译器和阅读代码的任何人发出信号,表明这是有意为之。

subtype Population is Natural range 0 .. 10000;

出于安全、消防安全、加热或冷却要求以及其他目的,我们必须知道有多少人占用了建筑物。它的范围在两端都有严格的限制:对于这座建筑,我们假设消防安全法规禁止超过 10000 人居住。

基本类型是自然类型(它本身是整数的子类型)而不是整数,因为人口永远不会小于零。

但是将 Population 设为新类型可能会导致无休止的类型转换问题。将其设为子类型可以更轻松地在热负荷计算、电梯调度策略、用水预测等方面使用人口。

它是一个子类型而不仅仅是 Integer 的事实仍然提供了有用的保护形式;虽然可以将整数分配给 Population 变量并在表达式中与它们混合,但任何分配超出范围的值的尝试都将被标记为错误。如果在编译时无法检测到它们,它们将在运行时引发异常。第 10001 个试图进入大楼的人也会如此。

我会让 Java 专家在 Java 中解释实现这些策略的最佳方法。