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



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

例如,如果DogAnimal的亚型,则

T => DogT => Animal的亚型Animal => TDog => 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(() => ())
*/

我认为NothingUnit的一个亚型,所以() => ()应该是Nothing => ()的一个亚型,因为() => ()Unit => Unit型。f() => ()在类型签名方面有什么区别?

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

CCD_ 19不是CCD_ 20。它实际上是lambda的一种语法,没有参数,导致Function0[T]。这里的括号不是单位。这是一种表示零参数的语法

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

(_: Unit) => Unit

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

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

相关内容

最新更新