为什么 () => () 不是 Nothing => () 的子类型

why is () => () not a subtype of Nothing => ()

在 scala 中,函数的输出类型是协变的,输入类型是逆变的。

例如,如果 DogAnimal 的子类型,则

T => DogT => Animal 的子类型,并且 Animal => TDog => 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(() => ())
*/

我认为NothingUnit的子类型,所以() => ()应该是Nothing => ()的子类型,因为() => ()Unit => Unitf() => () 之间的类型签名有什么区别?

你的逻辑是正确的。只是语法错误。

() => T 不是 Function1[Unit, T]。它实际上是没有参数的 lambda 语法,结果为 Function0[T]。这里的括号不是单位。这是表示零参数的语法

构造Unit => Unit的正确方法是:

(_: Unit) => Unit

您可以添加显式类型注释来验证:

val f: Function1[Unit, Unit] = _ => ()
useF(f)
// No error