通用特征的案例对象

use*_*000 6 scala traits

在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]
Run Code Online (Sandbox Code Playgroud)

我该如何定义ImplicitMessage?我可以把它变成一个案例类,但这显然不是那么好,因为它只需要一个实例.

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

par*_*tic 4

您可以使用Nothing如下所示:

case object ImplicitMessage extends Message[Nothing]
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

  • 协变:`trait Message[+T]` (2认同)