在Scala中
有函数f1: Father1 => Child2 为函数 f2: Child1 => Father2 的子类型
原因如下:
一个函数只有在调用的时候才会执行,
f1(father1:Father1)
是调用形式,f2(child1:Child1)
是调用形式,当需要将函数作为一个参数传递的时候,可以将f1
传递给需要f2
的函数。
首先,作为返回值,
f1
的返回值为f2
的返回值的子类型,OK!
其次,考虑
f(f2:Child1 => Father2){...}
,在f
中调用f2
时,传递的是参数是child1:Child1
,当调用f
时有f(f1)
,则在实际中被调用的是f1(child1:Child1)
,因此所有f1
中的操作都是安全的,因为f1
是被设计用于调用Father1
的,Bingo!
为何f1: Child1 => Child2
不为函数f2: Father1 => Father2
的子类型?
考虑f(f2:Father1 => Father2){...}
,在f
中调用f2
时,传递的是参数是father1:Father1
,当调用f
时有f(f1)
,则在实际中被调用的是f1(father1:Father1)
,因此所有f1
中的操作并不都是安全的,因为f1
是被设计用于调用Child1
的。
网友评论