[英]Scala ActionListener / anonymous function type mismatch
嘗試實現類似於http://www.codecommit.com/blog/scala/scala/scala-for-java-refugees-part-6的高階函數示例中的代碼
val button = new JButton("test")
button.addActionListener{ e:ActionEvent => println("test") }
add(button)
導致以下
error: type mismatch;
found : (java.awt.event.ActionEvent) => Unit
required: java.awt.event.ActionListener
button.addActionListener{ e:ActionEvent => println("test") }
^
至少對於我系統上的Scala編譯器版本2.7.6.final而言,這是正確的。 我可以通過顯式實現匿名ActionListener的Java風格的方式實現我想要的功能。
button.addActionListener( new ActionListener() {
def actionPerformed(e:ActionEvent) { println("test") }
})
據我了解,Scala應該可以使用鴨式輸入法來使ActionListener的這種顯式實現成為不必要。 那為什么在這里不起作用? 在這一點上,我幾乎沒有鴨嘴式的實踐經驗。
鴨子輸入與您的代碼不起作用的原因無關。 這是因為默認情況下,Scala的類型系統不提供接口類型和函數類型之間的隱式轉換。 但是,如果定義了以下隱式轉換,則您的代碼可以正常工作。
implicit def toActionListener(f: ActionEvent => Unit) = new ActionListener {
def actionPerformed(e: ActionEvent) { f(e) }
}
這種隱式轉換提供了從(ActionEvent => Unit)到ActionListner的轉換。
Scala不是鴨式的。 它具有可選的顯式結構化類型,但這與代碼不起作用的原因無關。
您的代碼不起作用,因為JButton.addActionListener期望將ActionListener
作為其參數,而不是函數。 即使scala是ducktyped,您也不能僅傳遞函數,因為ActionListener
上可用的相同方法對函數不可用。
請注意,文章說:“讓我們幸福的一刻,我們可以重寫Swing以充分利用Scala的語法”,即文章並未聲稱向您展示實際的代碼。
但是scala確實有它自己的swing軟件包( scala.swing
),其中包含的類比其Java等效類要使用的“ scalaish”類更多。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.