7

在 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?我可以使它成为一个案例类,但这显然不是很好,因为它只需要一个实例。

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

4

2 回答 2

4

你可以使用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
于 2013-03-24T14:30:46.633 回答
1

您可以通过使用如下类型参数定义隐式方法:

implicit def message[T]: Message[T] = new Message[T] {} 

编辑:如果你真的只有一个实例(你真的不应该这样做,因为你在对编译器撒谎,这很可能是你做错了),你可以简单地转换为 null:

implicit def message[T]: Message[T] = null.asInstancOf[Message[T]]
于 2013-03-24T15:22:01.623 回答