I've read about Scala having covariant return types for functions.
But what about its argument types? What does FunctionX(T1,...,R)
have to do with all this?
可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
回答1:
If you look at the documentation for any FunctionX
class, you'll see that the return type is co-variant and the argument types are contravariant. For instance, Function2 has the signature:
Function2[-T1, -T2, +R] extends AnyRef
You can spot the -
and +
before the type parameters, where -
means contravariant and +
covariant.
This means that given
class Animal
class Dog extends Animal
then
Function1[Animal, Dog] <: Function1[Dog, Dog]
Function1[Dog, Dog] <: Function1[Dog, Animal]
but
Function1[Dog, Animal] </: Function[Dog, Dog]
Function1[Animal, Animal] </: Function[Animal, Dog]
In other words, functions promise no less and require no more