通用特征的案例对象

时间:2013-03-24 14:27:26

标签: 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]

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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

您可以使用类似参数定义隐式方法,如下所示:

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

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

implicit def message[T]: Message[T] = null.asInstancOf[Message[T]]
相关问题