2015-05-03 45 views
2

鑑於以下對重載函數:爲什麼Scala無法在存在方法重載的情況下推斷匿名函數的類型,並且只有一個方法需要函數?

def onAction_=(implicit aeh: jfxe.EventHandler[jfxe.ActionEvent]) { 
    onAction() = aeh 
} 
def onAction_=(handler: ActionEvent => Unit): Unit = { 
    onAction() = new jfxe.EventHandler[jfxe.ActionEvent] { 
    override def handle(event: jfxe.ActionEvent): Unit = handler(event) 
    } 
} 

當試圖使用分配方法作爲這樣

onAction = { ae => doSomething() } 

Scala的抱怨爲ae缺少類型參數。爲什麼Scala無法推斷ae的類型,因爲只有一個重載採用函數類型,因此不會對調用哪種方法感到困惑。

Scala編譯器是否簡單地放棄嘗試在看到重載函數時推斷類型?

P.S.除此之外,IntelliJ Scala插件能夠將ae的類型解析爲ActionEvent的類型。我對插件能夠做一些編譯器不能做的事情感到好笑,或者沒有。

+0

不,這是絕對有可能在這種情況下推斷的函數的輸入類型。你可以把問題最小化爲一個獨立的例子,沒有依賴關係,也沒有多餘的東西(語法'_ ='糖,含義等)? –

+0

我試圖將問題最小化爲一個自包含的示例,並注意到,當我刪除所有導入時它工作正常。顯然有一個類似函數簽名的隱式轉換,編譯器基本上不知道選擇哪個。我想這個問題可以被看作是各種虛驚。我是否應該以我如何解決它的方式給出答案,至少作爲一個警示性的故事? –

回答

1

我想你錯過了一個getter/accessor。沒有吸氣者,你不能有一個裝甲師。下面是一個完整的例子,編譯:

import javafx.{ event => jfxe } 

class Foo { 
    private var _onAction: jfxe.EventHandler[jfxe.ActionEvent] = _ 

    def onAction = _onAction // the getter is necessary! 

    def onAction_=(implicit aeh: jfxe.EventHandler[jfxe.ActionEvent]) { 
    _onAction = aeh 
    } 
    def onAction_=(handler: jfxe.ActionEvent => Unit): Unit = { 
    _onAction = new jfxe.EventHandler[jfxe.ActionEvent] { 
     override def handle(event: jfxe.ActionEvent): Unit = handler(event) 
    } 
    } 
} 

object Driver extends App { 
    val f = new Foo 
    f.onAction = { ae => doSomething() } 

    def doSomething(): Unit = ??? 
} 
+0

我很欣賞這個答案,我希望事實證明對某人有幫助,但缺乏吸氣劑真的不是我的問題中的問題,我確實注意到問題源於缺少的類型參數,而不是一些其他問題。在相關說明中,如果您確實缺少getter,編譯器會抱怨重新分配val或類似內容。我希望它能說一些類似失蹤的吸氣劑,但這可能是一項不可能完成的任務。 –

+0

我推斷我可以對你沒有包含的代碼做些什麼。如果我刪除getter並將var重命名爲'onAction',我會得到與之相同的錯誤。也許你可以從我發佈的代碼開始,並添加你的功能,直到你發現問題。 – dwickern

相關問題