Я хочу внедрить универсальное и безопасное хранилище доменов.Скажем, у меня есть
trait Repo[Value] {
def put(value: Value): Unit
}
case class IntRepo extends Repo[Int] {
override def put(value: Int): Unit = ???
}
case class StringRepo extends Repo[String] {
override def put(value: String): Unit = ???
}
case class DomainRepo(intRepo: IntRepo, stringRepo: StringRepo) {
def putAll[?](values: ?*): Unit // what type should be here?
}
В результате я хочу получить следующие API:
domainRepo.putAll(1, 2, 3, "foo", "bar") //Should work
domainRepo.putAll(1, 2, true, "foo") // should not compile because of boolean value
Вопрос в том, как этого добиться?
, поэтому я вижу только одинспособ сделать его безопасным.Это сопоставление с образцом для любого типа, например
def putAll(values: Seq[Any]) => Unit = values.foreach {
case str: String => stringRepo.put(str)
case int: Int => intRepo.put(int)
case _ => throw RuntimeException // Ha-Ha
}
, но что если у меня будет 10000 типов здесь?это был бы беспорядок!
еще один неясный для меня подход на данный момент - использовать тип dotty |(или) вроде следующего:
type T = Int | String | 10000 other types // wouldn't be a mess?
def putAll(t: T*)(implicit r1: Repo[Int], r2: Repo[String] ...) {
val myTargetRepo = implicitly[Repo[T]] // would not work
}
Итак, что вы думаете?это вообще возможно?
простой способ, который я видел, был
Map[Class[_], Repo[_]]
, но этот способ позволяет делать много ошибок