У меня есть следующая черта:
trait Storage[C <: Config] {
def get(name: String, version: Int): Option[C]
def list: List[(String, String)]
def register(config: C): Boolean
}
, и я хочу создать следующий класс:
class MultiStorage[C <: Config](storages: List[Storage[_ <: C]]) extends Storage[C] {
def get(name: String, version: Int): Option[C] = {...}
def list: List[(String, String)] = {...}
def register(config: C) = {...}
Если не ясно, это означает, что MultiStorage
хранит элементытипа C
(или подтипа) в нескольких хранилищах, каждое из которых содержит элементы одного типа.
Я борюсь с обобщениями для реализации метода регистра.Идея состоит в том, что в зависимости от типа объекта, который я хочу зарегистрировать, мне нужно выбрать правильное хранилище для регистрации, что-то вроде:
def register(config: C) = {
storages.foreach(s => {
if (typeOf(s) is Storage[C]) { // same type of config
s.register(config)
return
}
})
}
Я сделал несколько попыток с обобщениями и тегами типов, но ничегоПолезно поделиться здесь.Я, вероятно, думаю, что мне нужно добавить еще один тип тега, чтобы отличить то, что я получаю в регистре и что объявляется как тип хранилища.
Одна из идей, которые я пробовал, имел метод в Storage
, который возвращаеттипа:
protected def getType()(implicit tag: TypeTag[C]): universe.Type = typeOf[C]
но на стороне вызывающей стороны я смог получить в результате что-то вроде _$1
, что я, честно говоря, не понимаю, что это значит.
Еще одна попытка былаиспользовать shapeless
, но в этом случае я не уверен, возможно ли иметь мульти-хранилище, содержащее произвольное количество элементов в HList
хранилище