在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],但我不能(要求)。
答案 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]]