在 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和之間的型別簽名有什么區別() => ()?
uj5u.com熱心網友回復:
你的邏輯是正確的。只是語法是錯誤的。
() => T不是Function1[Unit, T]。它實際上是一種沒有引數的 lambda 語法,結果是Function0[T]. 這里的括號不是單位。這是一種表示零引數的語法
構造a的正確方法Unit => Unit是:
(_: Unit) => Unit
您可以添加顯式型別注釋來驗證:
val f: Function1[Unit, Unit] = _ => ()
useF(f)
// No error
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/441328.html
