这项工作:
class myTest {
def max(x: Int64, y: Int32) : Int64 = {
if (x > y)
x
else
(y : Int64)
} ensuring(res => x <= res && y <= res)
}
这也适用于:
class myTest {
def max(x: Int64, y: Int32) : Int64 = ({
if (x > y)
x
else
y
}: Int64) ensuring(res => x <= res && y <= res)
}
这显然行不通:
class myTest {
def max(x: Int64, y: Int32) : Int64 = {
if (x > y)
x
else
y
} ensuring((res: Int64) => x <= res && y <= res)
}
为什么?单独查看此表达式:
{
if (x > y)
x
else
y
}
如果没有显式地指定类型,编译器可以从中派生什么?它将派生出如下内容
Serializable
,甚至
AnyRef
. 它还能做什么?打字机以非常直接的方式工作。它只是查看一个表达式,尝试派生它的最精确类型,如果没有从外部指定类型,它不会尝试隐式转换任何内容。而且它不会开始在代码的偏远角落搜索其他类型提示。在这种情况下,
ensuring ( ... )
既不是此表达式的一部分,也不允许显式返回类型归属
: Int64 =
涓涓细流。
我想,要理解为什么这一点显而易见,最好的方法是为简单类型的lambda演算编写一个小的类型检查器:它非常简单,但在类似的情况下,它已经表现出完全相同的行为。