首页 文章

如何在Scala中为Typeclass的“常规”泛型混合使用更高级的类型

提问于
浏览
1

我正在尝试在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 对任何集合进行操作,前提是它的内容有 DataSerializerDataCollectionSerializer

1 回答

  • 0

    您可以将 DataCollectionSerializer 更改为

    trait DataCollectionSerializer[Collection[_]] {
      def serializer[A: DataSerializer]: DataSerializer[Collection[A]]
    }
    

    并获得 DataSerializer 例如 List[Int]implicitly[DataCollectionSerializer[List]].serializer[Int] . 然后所有非更高类型的类型都有 DataSerializer ,您不需要混合任何东西 .

相关问题