在Scala中:我想定义一个Message [T]类型(它需要具有此签名),它可以是一个包含某些T类型数据的消息,也可以是一个隐式消息。我有

trait Message[T]
case object ImplicitMessage extends Message <- obviously doesn't compile
case class DataMessage[T](d: T) extends Message[T]

我应该如何定义ImplicitMessage?我可以将其设置为case类,但这显然不是那么好,因为它只需要一个实例。

更新:我知道我可以简单地从消息中删除[T],但是我不能(要求)。

最佳答案

您可以使用Nothing,如下所示:

case object ImplicitMessage extends Message[Nothing]
Nothing是一种特殊类型,它是所有可能类型的子类型,并且没有实例。

如果由于Message[T]而遇到方差问题,则可以使用以下技巧:
object ImplicitMessage extends Message[Nothing] {
  def apply[T]: Message[T] = this.asInstanceOf[Message[T]]
}

scala> ImplicitMessage[String]
res1: Message[String] = ImplicitMessage$@4ddf95b5
scala> ImplicitMessage[Long]
res2: Message[Long] = ImplicitMessage$@4ddf95b5

关于scala - 通用特征的案例对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15599663/

10-10 13:01