2

Unit を匿名クラスのメソッドに変換することは可能ですか?

それ以外の:

addSelectionListener(new SelectionListener{
    def widgetSelected(SelectionEvent event): Unit = {
       //...
    }
}

これに:

addSelectionListener toAnonymousClass(classOf[SelectionListener], { 
    /* .. */ 
})

これを行うことができるライブラリがない場合、どうすれば作成できますか? 出来ますか?

4

2 に答える 2

5

次の暗黙的な変換により、必要な結果が得られるはずです。

implicit def selectionListener (f: SelectionEvent => Unit) = 
  new SelectionListener {
    def widgetSelected(event: SelectionEvent) {
      f(event)
    }
  }

タイプの関数リテラルを自動的にに変換するSelectionEvent => Unitため、次のようにメソッドSelectionListenerを使用できます。addSelectionListener

addSelectionListener { event: SelectionEvent =>
    /* .. */ 
}
于 2012-07-06T11:43:44.697 に答える
1

にオーバーロードを追加するだけでaddSelectionListener、暗黙的な変換が不要になります。2.10 から、このような変換には のインポートが必要にlanguage.implicitConversionsなりますが、可能であれば避けるべきであるという微妙なヒントがあります。

def addSelectionListener(f: SelectionEvent => Unit) = 
  addSelectionListener(new SelectionListener {
    def widgetSelected(event: SelectionEvent): Unit = f(event)
  }
})

次に、として使用します

addSelectionListener { se => 
  /* ... */
}

型注釈が必要ないため、ボイラープレートも少なくなります。

他の場所で使用する場合は、addSelectionListener定義されているもののサブクラスまたはトレイトにオーバーロード メソッドを配置できます。

于 2012-07-06T19:37:47.083 に答える