【发布时间】:2019-07-31 10:26:57
【问题描述】:
我有以下特点:
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(或子类型)类型的元素存储在多个存储中,每个存储都包含单一类型的元素。
我正在使用泛型来实现 register 方法。这个想法是,根据我要注册的对象类型,我需要选择正确的存储来注册,例如:
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 存储中拥有包含任意数量元素的多存储
【问题讨论】:
-
假设我们有
trait Configobject config1 extends Configobject config2 extends Configobject storage1 extends Storage[config1.type]object storage2 extends Storage[config2.type]val multiStorage = new MultiStorage[Config](List(storage1, storage2))那么multiStorage.register(config1)、multiStorage.register(config2)是什么?s都不是Storage[C]类型,即Storage[Config]。 -
正如我所说,我可能滥用了泛型。在您提到的示例中,我希望
multiStorage.register(config1)内部调用storage1.register(config1)和multiStorage.register(config2)内部调用storage2.register(config2)
标签: scala generics types shapeless