簡體   English   中英

Scala ActionListener /匿名函數類型不匹配

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM