我在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中使用泛型时表示缺少类型的好方法?
答案 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())
}