小编Iva*_*ass的帖子

在隐式类中创建的Scala不兼容嵌套类型

所提供的代码片段是一个虚构的简约示例,仅用于说明问题,与实际的业务逻辑类型无关。

在下面的代码中,我们在Entry类型内部有一个嵌套Registry类型。

class Registry[T](name: String) {
  case class Entry(id: Long, value: T)
}
Run Code Online (Sandbox Code Playgroud)

这是有道理的,因为不同注册表的条目是不同的,不可比拟的类型。

然后,我们可能有一个隐式的Ops类,例如,在测试中使用的类,它将我们的注册表绑定到某些测试存储实现(一个简单的可变映射)

object testOps {

  import scala.collection.mutable

  type TestStorage[T] = mutable.Map[Long, T]

  implicit class RegistryOps[T](val self: Registry[T])(
    implicit storage: TestStorage[T]
  ) {

    def getById(id: Long): Option[self.Entry] = 
      storage.get(id).map(self.Entry(id, _))

    def remove(entry: self.Entry): Unit       = storage - entry.id
  }
}
Run Code Online (Sandbox Code Playgroud)

的问题是:所述Entry包装物被视为无法比拟的类型到原来的注册表对象consructed内行动

object problem {

  case class Item(name: String)

  val items = new Registry[Item]("elems")

  import testOps._

  implicit val storage: TestStorage[Item] = 
    scala.collection.mutable.Map[Long, …
Run Code Online (Sandbox Code Playgroud)

scala implicit inner-classes scala-2.12

5
推荐指数
1
解决办法
72
查看次数

标签 统计

implicit ×1

inner-classes ×1

scala ×1

scala-2.12 ×1