Scala trait子类约束

时间:2013-12-11 23:35:42

标签: scala types traits

我有一组基于“消息”特征的消息:

trait Message{
  id: Int
}

case class AckMsg(id: Int) extends Message
case class NackMsg(id: Int) extends Message

并有一些功能将它们作为参数:

def replyAck(ack: AckMsg) = { ... }

def replyNack(nack: NackMsg) = { ... }

当我定义一些更高级别的功能来利用这些功能时,我遇到了:

def replyingMsg(fun: Message => Unit): Unit = { ... } 

replyingMsg(replyAck(AckMsg(id)))   //compiling error here!

编译器不喜欢我有(Message => Unit)但传递(AckMsg => Unit)

的事实

那么,我怎样才能回复Msg,定义类似的东西:

def replyingMsg(fun: M <: Message => Unit) //imagery code!!!

以上代码有误:

  1. 由于某种原因,一旦涉及&lt ;:消息不能成为特质,需要成为一个类
  2. &lt;:似乎没有正确描述情况
  3. 如何告诉编译器我传递的是特征的子类? 请有人了解复杂的类型系统。

2 个答案:

答案 0 :(得分:1)

我想你想要以下内容:

def replyingMsg[T <: Message](fun: T => Unit): Unit = { }

说好玩是从T到Unit的函数,这样T就是Message的子类。我不打算评论当前使用Trait与抽象类的设计的优点,但如果其他人有想法,我会感兴趣。

答案 1 :(得分:1)

你有一个问题,第一类函数(replyAck _)和(replyNack _)实际上是Function1 [-Message,+ Unit]类型的特征,所以它们处于Message的控制位置。

如果您仍想遵循此模式并使用方法def replyingMsg(fun:Message =&gt; Unit):无需更改的单位,您可以通过多种方式解决此问题。例如,使用pf:

def replyingMsg(fun: Message => Unit): Unit = {println("success")}

scala> def replyAck: Message => Unit = {case AckMsg(id) => Unit}
replyAck: Message => Unit

scala> replyingMsg(replyAck)
success