簡體   English   中英

類型 Class 隱含上下文綁定

[英]Type Class Implicits with Context Bound

我正在慢慢地自學 Scala 類型的課程。 假設我有以下示例:

object Example extends App {

  trait Serializer[T] {
    def serialize(seq: Seq[T]): String
  }

  object Serializer {
    def serialize[T](seq: Seq[T])(implicit serializer: Serializer[T]): Value = serializer.serialize(seq)
  }

  implicit object StringSerializer extends Serializer[String] {
    def serialize(seq: Seq[String]): String = seq.toString()
  }

  implicit object IntSerializer extends Serializer[Int] {
    def serialize(seq: Seq[Int]): String = seq.toString()
  }

  case class Data[T: Serializer](x: Seq[T], y: Seq[T], z: Seq[T]) {
    val series = Data.createString(x, y, z)
  }

  object Data {
    def createString[T : Serializer](x: Seq[T], y: Seq[T], z: Seq[T]) = {
      val serialize = implicitly[Serializer[T]]
      List(serialize.serialize(x), serialize.serialize(y))
    }
  }

  val x = Seq("a", "b", "c")
  val y = Seq(1, 2, 3, 4)
  val z = Seq(10, 20, 30)
  val data = Data(x, y, z)
  println(data.series)
}

現在這失敗了

找不到 Example.Serializer[Any] [error] val data = Data(x, y, z) 類型的證據參數的隱式值

有人可以指導我如何使createString方法起作用嗎? 據我了解,因為我有一個Seq[Int]和一個Seq[String] ,類型[T]將被推斷為[Any] ,這會導致問題。

但是,我根據我的Serializer器類型 class 放置了一個上下文綁定,我認為這會使編譯器查找StringInt序列化器,但它無法做到這一點。 我基本上想傳遞我定義了序列化程序的任何序列,所以在這個序列中Seq[Int]Seq[String]的任意組合。

任何指導將不勝感激!

問題再次是您想要不同的類型,但您使用的是單個類型參數T 所以編譯器推斷出任何。
也許您想像這樣定義您的 class :

final case class Data[A: Serializer, B: Serializer, C: Serializer](x: Seq[A], y: Seq[B], z: Seq[C])

所以你可以有三種不同的類型。


順便說一句,我建議你使用ListVectorArraySeq即具體的 collections ,而不是抽象Seq

如果您希望Data的字段是不同元素類型的Seq ,請執行此操作

case class Data[T: Serializer, T1: Serializer, T2: Serializer](x: Seq[T], y: Seq[T1], z: Seq[T2]) {
  val series = Data.createString(x, y, z)
}

object Data {
  def createString[T : Serializer, T1 : Serializer, T2 : Serializer](x: Seq[T], y: Seq[T1], z: Seq[T2]) = {
    val serialize = implicitly[Serializer[T]]
    val serialize1 = implicitly[Serializer[T1]]
    val serialize2 = implicitly[Serializer[T2]]
    List(serialize.serialize(x), serialize1.serialize(y), serialize2.serialize(z))
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM