我试图想出一个很好的例子,详细说明Ada的严格打字和Java强打字之间的区别。 有没有人有一个很好的例子,可以使用基于整数的值来识别类型转换中的这些差异?
答案 0 :(得分:7)
从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变量并在表达式中与它们混合,但任何分配超出范围值的尝试都将被标记为错误。如果在编译时无法检测到它们,则它们将在运行时引发异常。第10001名试图进入大楼的人也将如此。
我将让Java专家解释在Java中实现这些策略的最佳方法。