函数类型在写法上
(T1,T2…) => R
小括号里的是入参类型(最多可以有22个,最少为0),右箭头右边的是返回结果类型。
函数类型里可以使用通配符“_”,表示任意类型:
scala> val x: String => _ = null
x: Function1[String, _] = null
右箭头形式的背后是转换成FunctionN[T1,T2…, R]
(N对应0~22),有点要注意的是,FunctionN
在对其类型参数的定义,入参类型都是逆变的,而结果类型是协变的。它反映了函数类型也是具有多态特性的,参考这篇:scala中函数类型的多态,这里再补充一下温悦在ATA上对这篇blog的评论,他的这张图很好:
有2个函数: f1, f2; 我们若能说f2是f1的子类,当且仅当:f2的定义域类型x2 “大于” f1的定义域类型x1,且f2的值域y2 “小于” f1的值域y1; 其中“大于”指“是父类”;“小于”指“是子类”;
进一步讲,f1(父类函数)能接受的任意参数,f2也能接受,且经由f2映射而得出的结果的类型,也一定在经由f1映射所得结果的类型的“范围内”(是其子类)
再进一步讲:当代码里有对f1的调用“f1(x)”时,你可以尽管将这里的f1换成f2而不会出现类型错误,这也就是关乎“函数类型”的“里氏替换原则(LSP)”
x1(“SomeString”) 为什么会提示”Unspecified value parameter v1.
”
scala> x(“SomeString”)
java.lang.NullPointerException
… 32 elided
”
请问该如何调用 x 呢?
你还没定义他,你只是声明了而已