Scala Generics:表示缺少类型

时间:2016-05-24 04:32:14

标签: scala generics events

我在Scala中创建了一个事件特征,其外观如下:

trait Event[A]
{
    def addListener(f: A=>Unit): Unit
    def rmvListener(f: A=>Unit): Unit
}

它适用于所有类型A的预期效果,但有一个例外:Event[Unit]要求回调根据需要使用(Unit)=>Unit而不是()=>Unit。同样,Event[Nothing]要求回调的类型为(Nothing)=>Unit。我试过扩展Event[],但它没有编译。

我希望避免写event.addListener((Unit)=>{ /*logic*/ }

可能最简单的解决方案是使用Action编写第二个特征f: ()=>Unit,但我希望避免重复事件系统逻辑。

有没有人知道在Scala中使用泛型时表示缺少类型的好方法?

1 个答案:

答案 0 :(得分:1)

  

有没有人知道在Scala中使用泛型时表示缺少类型的好方法?

没有。但

  

我希望避免写event.addListener((Unit)=>{ /*logic*/ }

你不需要;你会写event.addListener { _ => /*logic*/ }event.addListener { case () => /*logic*/ }(请注意,在第二种情况下,{}而不是()是必需的。

  

可能最简单的解决方案是使用f :()=>单位编写第二个特征Action,但我希望避免重复事件系统逻辑。

你可以像

那样写
trait Action extends Event[Unit] {
  // calls Event.addListener
  def addListener(f: () => Unit) = addListener(_ => f())
}