为什么 () => () 不是 Nothing => () 的子类型
why is () => () not a subtype of Nothing => ()
在 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(() => ())
*/
我认为Nothing
是Unit
的子类型,所以() => ()
应该是Nothing => ()
的子类型,因为() => ()
是Unit => Unit
。 f
和 () => ()
之间的类型签名有什么区别?
你的逻辑是正确的。只是语法错误。
() => T
不是 Function1[Unit, T]
。它实际上是没有参数的 lambda 语法,结果为 Function0[T]
。这里的括号不是单位。这是表示零参数的语法
构造Unit => Unit
的正确方法是:
(_: Unit) => Unit
您可以添加显式类型注释来验证:
val f: Function1[Unit, Unit] = _ => ()
useF(f)
// No error
在 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(() => ())
*/
我认为Nothing
是Unit
的子类型,所以() => ()
应该是Nothing => ()
的子类型,因为() => ()
是Unit => Unit
。 f
和 () => ()
之间的类型签名有什么区别?
你的逻辑是正确的。只是语法错误。
() => T
不是 Function1[Unit, T]
。它实际上是没有参数的 lambda 语法,结果为 Function0[T]
。这里的括号不是单位。这是表示零参数的语法
构造Unit => Unit
的正确方法是:
(_: Unit) => Unit
您可以添加显式类型注释来验证:
val f: Function1[Unit, Unit] = _ => ()
useF(f)
// No error