我正在尝试在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
?
1 回答
您可以将
DataCollectionSerializer
更改为并获得
DataSerializer
例如List[Int]
:implicitly[DataCollectionSerializer[List]].serializer[Int]
. 然后所有非更高类型的类型都有DataSerializer
,您不需要混合任何东西 .