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 をどのように定義すればよいですか? これをケース クラスにすることもできますが、必要なインスタンスは 1 つだけであるため、明らかにあまり適切ではありません。

更新: メッセージから [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] {} 

編集:本当に 1 つだけのインスタンス (コンパイラに嘘をついていて、これはおそらく間違っている可能性が高いため、実際にはすべきではありません) の場合は、単純に null をキャストできます。

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