我正在尝试在scala中编写自己的Typeclass,以提供一种将类转换为任意“DataObject”的机制(我正在使用下面的Map,但我不希望这很重要) 。到目前为止,我有以下内容:
type DataObject = Map[String, Any]
trait DataSerializer[A] {
def toDataObject(instance: A): DataObject
def fromDataObject(dataObject: DataObject): A
}
这适用于“简单”类,我可以创建一个实现此特征的具体类来充当我的序列化程序。但是,我认为允许集合/容器序列化也很好,而不必为可能包含的每种类型创建不同的实现。我最终得到了这个:
trait DataCollectionSerializer[Collection[_]] {
def toDataObject[A: DataSerializer](instance: Collection[A]): DataObject
def fromDataObject[A: DataSerializer](dataObject: DataObject): Collection[A]
}
即。如果集合的内容可以序列化,则可以序列化集合。
同样,这适用于大多数事情,但如果我在集合中有一个集合怎么办?例如,List[List[Int]]
(假设存在DataCollectionSerializer[List]
和DataSerializer[Int]
的某些实现)将需要DataSerializer[List[Int]]
的实现。我可以继续为每个级别的遏制继续编写一个新的特征,但这最终会导致我的类型类可以实现的上限。
我是否可以通过某种方式将这两个特征结合起来,以允许DataCollectionSerializer
对任何集合进行操作,前提是其内容有DataSerializer
或DataCollectionSerializer
?
答案 0 :(得分:0)
您可以将DataCollectionSerializer
更改为
trait DataCollectionSerializer[Collection[_]] {
def serializer[A: DataSerializer]: DataSerializer[Collection[A]]
}
并获取DataSerializer
例如List[Int]
:implicitly[DataCollectionSerializer[List]].serializer[Int]
。然后,所有非高级类型都有DataSerializer
,您不需要混合任何内容。