CDuce/Types/Coercion
外观
let x = 7;; -> val x : 7 = 7
x 的值为 7,类型为 7(包含整数七的单例)
let y1 = (x : Int);; let y2 : Int = x;;
这两个向上强制转换的结果相同:值为 7,类型为 Int。这是可能的,因为单例 7 是整数集的子集。
静态向下强制转换不可行
type Positive = 1--* let y = (7 : Int);;
let yp = (y : Positive);; -> This expression should have type: Positive but its inferred type is: Int which is not a subtype, as shown by the sample: *--0
但动态向下强制转换可行
let yp1 :? Positive = y;; let yp2 = (y :? Positive);;
如果强制转换不可行,则在执行时会引发一个异常
let ybad = (y :? Char);; -> Uncaught CDuce exception: "Value 7 does not match type Empty\n"
消息中包含 "Empty" 是因为动态强制转换会给出合取类型。这可以通过以下方式看到
(7 : 1--8) :? 5--10;;
它看起来具有类型 5--8
请注意,对于向上强制转换,静态方法效率更高,并且提供更好的错误处理。此外,由于合取机制,向上强制转换不能是动态的
(7 : 1--8) :? Int;;
仍然是类型 1--8,而不是 Int。