在scala中,函数的输出类型是协变的,输入类型是反变的。
例如,如果Dog
是Animal
的亚型,则
T => Dog
是T => Animal
的亚型Animal => T
是Dog => T
的一个亚型
换句话说,Dog
的生产者可以去预期Animal
的生产者的地方,并且CCD_ 9的消费者可以去预期CCD_。
那么为什么我会得到这个编译错误:
def useF(f: Nothing => Unit): Unit = ()
def f(x: Unit): Unit = ()
useF(f) // ok
useF(() => ()) // error
/*
example.scala:4: error: type mismatch;
found : () => Unit
required: Nothing => Unit
useF(() => ())
*/
我认为Nothing
是Unit
的一个亚型,所以() => ()
应该是Nothing => ()
的一个亚型,因为() => ()
是Unit => Unit
型。f
和() => ()
在类型签名方面有什么区别?
您的逻辑是正确的。只是语法错误。
CCD_ 19不是CCD_ 20。它实际上是lambda的一种语法,没有参数,导致Function0[T]
。这里的括号不是单位。这是一种表示零参数的语法
构造Unit => Unit
的正确方法是:
(_: Unit) => Unit
您可以添加显式类型注释进行验证:
val f: Function1[Unit, Unit] = _ => ()
useF(f)
// No error