我遇到一個問題,即隱式的()=>X
轉換髮生在我定義和使用一元運算符時。下面是一個小例子:爲什麼一元運算符啓用a()=> X隱式轉換?
class Gate {
def unary_!(): Gate = this
}
class Foo {
private def foo(f:() => Gate) = 1
val gate = new Gate
// Compiles, -Xprint:typer shows it becomes
// Foo.this.foo({
// (() => Foo.this.gate.unary_!())
// })
foo(!gate)
// Does not compile, we get
// error: type mismatch;
// found : Gate
// required:() => Gate
// foo(gate)
foo(gate)
}
哪裏這個() => Gate
轉換髮生,爲什麼它只有unary_!
發生的呢?
編輯
感謝您的回答!我提出這個問題,因爲埃塔擴張(從X
到() => X
塊我們爲X
定義,並希望發生的另一個隱式轉換。從unary_!
刪除不必要的括號內爲我們解決了這個問題。謝謝!
爲什麼當你明確地寫'!gate'而不是'gate'時,你認爲這是一個隱式轉換? –
這與編寫'-5'而不是'5'相同。它適用於整數'5'上的一元運算符'-'。這可能是通過在一元運算符的參數上使用'reflection'來完成的,然後應用相應的函數。這與「隱含」無關。 –
@SarveshKumarSingh,我指的是函數foo的參數。注意它需要一個()=> Gate,但我用Gate調用它。 – user716468