键入包含类型参数本身的参数

时间:2016-11-11 14:16:51

标签: scala generics type-parameter

为了返回数据库插入的状态和键,我创建了以下结构:

sealed trait InsertResult[+I] extends Product with Serializable

object InsertResult {
  case class Created[+I](insertedId: I) extends InsertResult[I]
  case object DuplicateKey extends InsertResult[Nothing]
}

类型参数I是创建的密钥的类型(例如UUID)。如果插入成功,则返回Created[I];如果出现重复键错误,则返回DuplicateKey对象。

这样可行,但由于数据库添加的元数据多于密钥,因此我希望将I替换为Entity[I, T],其中I仍然是密钥类型,而T }表示插入对象的类型(基本上是InsertResult[Entity[I, T]])。但是,我在执行此操作时遇到了麻烦,只需替换type参数就会给参数insertedId带来错误(I并且T无法解析。)

I替换为Entity[I, T]时,如何查看类型和方法签名?

2 个答案:

答案 0 :(得分:0)

这对你的用例来说不够吗?

case class Entity[I, T](id: I, obj: T)

sealed trait InsertResult[I, T] extends Product with Serializable

object InsertResult {
  case class Created[I, T](entity: Entity[I, T]) extends InsertResult[I, T]
  case object DuplicateKey extends InsertResult[Nothing, Nothing]
}

答案 1 :(得分:0)

package com.example

object Answer extends App {
  case class Entity[I, T](id:I, obj:T)

  sealed trait InsertResult extends Product with Serializable {}

  object InsertResult {
    case class Created[I, T](entity:Entity[I, T]) extends InsertResult
    case object DuplicateKey extends InsertResult
  }

  object Storage {
    var data = Map.empty[Any, Any]

    def insert[I, T](entity:Entity[I, T]):InsertResult =
      data.get(entity.id) match {
        case Some(_) => InsertResult.DuplicateKey
        case None =>
          data += entity.id -> entity.obj
          InsertResult.Created(entity)
      }
  }

  val entities = Seq(Entity(1, "foo"), Entity(2, "bar"), Entity(1, "foobar"))
  entities map Storage.insert foreach println
}