首页 > 解决方案 > Scala中具体用例的类型参数/抽象类型

问题描述

我有一个参数化的 ADT :

  sealed trait Location[O]

  sealed abstract class SingleRegion(val bucket: String) extends Location[String]

  sealed abstract class MultiRegion(val buckets: Seq[String]) extends Location[Seq[String]]

  sealed abstract class Synchronized(val bucket: String) extends Location[Seq[String]]

我定义了一个包含位置的类 Log

  final  case class Log[O, L <: Location[O]](location: L) {
    def find(
        bucket: String
    )(implicit ev: L =:= MultiRegion): Option[Log[String, _ <: SingleRegion]] =
      location.buckets
        .find(_ == bucket)
        .map(bucket => Log(new SingleRegion(bucket) {}))
  }

  val log: Log[Seq[String], MultiRegion] = Log(new MultiRegion(List("r1", "r2")) {})
  println(log.find("r1"))

标签: scalatype-systemsalgebraic-data-types

解决方案


这似乎对我有用。
让我知道它是否不适合你。

final case class Log[O, L](location: L)
                          (implicit ev: L <:< Location[O]) {
  def find(bucket: String)
          (implicit ev: L =:= MultiRegion): Option[Log[String, SingleRegion]] =
    location
      .buckets
      .find(_ == bucket)
      .map(bucket => Log(new SingleRegion(bucket) {}))
}

推荐阅读