我有一组基于“消息”特征的消息:
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!!!
以上代码有误:
如何告诉编译器我传递的是特征的子类? 请有人了解复杂的类型系统。
答案 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