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 => 
  /* ... */
}

这也更少样板,因为您不需要类型注释。

If you use it in other places you could put the overload method in a subclass of whatever addSelectionListener is defined in, or in a trait.

于 2012-07-06T19:37:47.083 回答