【问题标题】:How to write a method that takes a parameter with a covariant or contravariant bound in scala?如何编写一个在scala中接受具有协变或逆变约束的参数的方法?
【发布时间】:2016-03-05 13:48:36
【问题描述】:

我正在编写一个 scala 程序,它在某些时候应该为某些任务提供一些状态更新,它也可以为任务组提供它。重点是在不同的phases,细节不一样。所以实际上Details trait 有多种实现方式,我没有在这里介绍。

case class GroupMessage [+S <: Details]
(
  id: String,
  statuses: List[StatusMessage[S]]
) 

case class StatusMessage [+S <: Details]
(
  id: String,
  phase: Phase,
  statusDetails: S
)

sealed trait Details {
  def getDetails: List[String]
}

现在,问题是接收此状态更新的方法,我无法正确签名。如果我只是输入def receiveStatus(status: StatusMessage),编译器会抱怨StatusMessage 采用类型参数。我以为我需要像 def receiveStatus[S :&gt; Details](status: StatusMessage[S]) 这样的东西,但这也不能编译。

【问题讨论】:

    标签: scala traits generic-variance


    【解决方案1】:

    符号 :&gt; 不存在 - 您可能打算使用 &gt;:

    但这仍然无法编译,因为您希望 S 成为 Details 的子类型(例如 SpecialDetails,而不是超类型(例如 Any)。

    def receiveStatus[S <: Details](status: StatusMessage[S])
    

    【讨论】:

    • 没错。我很抱歉问了这么愚蠢的问题!也许我可以将其归咎于符号不直观且容易忘记......
    • @Mahdi 我之前也落入了同样的陷阱 :)
    • @Mahdi - 我以前也这样做过。请记住,冒号始终是类型名称之前的最后一个字符。
    猜你喜欢
    • 1970-01-01
    • 2019-12-11
    • 2015-02-09
    • 1970-01-01
    • 2011-09-01
    • 1970-01-01
    • 2012-12-25
    • 1970-01-01
    • 2013-02-17
    相关资源
    最近更新 更多