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

Luk*_*mer 2 java ada type-conversion

我试图想出一个很好的例子,详细说明了Ada的严格打字和Java的强类型之间的区别.有没有人有一个很好的例子来确定使用基于整数的值的类型转换中的这些差异?

Bri*_*ond 7

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

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

新类型被认为是与任何先前类型完全不同的类型,即使它具有相同的值范围.新类型的对象只能分配给新类型的变量,依此类推.

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

使用类型系统的艺术需要一些练习,而且 - 在类型和子类型之间进行选择 - 是重要的一个领域.它在与类型系统的挫折之间产生差异,并使程序简单易用地组合在一起.

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

一个例子:想象一下建筑物的自动化,包括其升力系统:

type Floor is new Integer range -3 ..135;
Run Code Online (Sandbox Code Playgroud)

有几个地下车库,一个地下室,0楼是底层(欧洲而不是美国建筑!),上面有135层,比高耸的地狱高一层.

这可以安全地成为一种新类型,因为几乎没有将Floor变量与其他任何东西混淆的危险,并且很少需要在数学上将Floor与任何其他数量相结合.升降机需要去那里,而这就是它.在这种情况下,将Floor作为新类型可以捕获一些错误,但增加的安全性是值得的,没有痛苦的前景.

使用类型或子类型作为数组索引和循环边界是一种很有可能进行越界访问的好方法.

Array(Floor) of ...
for f in Floor loop ...
Run Code Online (Sandbox Code Playgroud)

如果确实需要从整数变量分配到Floor,则类型转换会向编译器和读取代码的任何人发出信号.

subtype Population is Natural range 0 .. 10000;
Run Code Online (Sandbox Code Playgroud)

我们必须知道有多少人占用建筑物,安全,消防安全,供暖或制冷要求以及其他用途.它的范围在两端都有严格的限制:对于这栋建筑,我们假设消防安全法规禁止超过10000名乘客.

基类型是Natural(本身是Integer的子类型)而不是Integer,因为总体不能小于零.

但是将Population设为新类型可能会导致无穷无尽的类型转换问题.将其作为子类型使得在热负荷计算,升力调度策略,用水预测中使用群体更容易,仅举几个例子.

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

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