Cap*_*ous 4 scala covariance higher-order-functions unit-type bottom-type
在 scala 中,函数的输出类型是协变的,输入类型是逆变的。
例如,如果Dog是 的子类型Animal,则
T => Dog是 的子类型T => Animal,并且
Animal => T是 的子类型Dog => T
换句话说, 的生产者Dog可以前往 的生产者Animal期望的地方,而 的消费者Animal可以前往 的消费者Dog期望的地方。
那么为什么我会收到这个编译错误:
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(() => ())
*/
Run Code Online (Sandbox Code Playgroud)
我认为这Nothing是 的子类型Unit,所以() => ()应该是 的子类型Nothing => (),因为() => ()是类型Unit => Unit。f和之间的类型签名有什么区别() => ()?
你的逻辑是正确的。只是语法错误。
() => T不是Function1[Unit, T]。它实际上是不带参数的 lambda 语法,结果是Function0[T]. 这里的括号不是单位。这是表示零参数的语法
构造a的正确方法Unit => Unit是:
(_: Unit) => Unit
Run Code Online (Sandbox Code Playgroud)
您可以添加显式类型注释来验证:
val f: Function1[Unit, Unit] = _ => ()
useF(f)
// No error
Run Code Online (Sandbox Code Playgroud)