我怎样才能将更高级别的东西与#34;常规" Scala中Typec类的泛型

时间:2015-02-26 01:36:59

标签: scala generics typeclass higher-kinded-types

我正在尝试在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 :(得分:0)

您可以将DataCollectionSerializer更改为

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

并获取DataSerializer例如List[Int]implicitly[DataCollectionSerializer[List]].serializer[Int]。然后,所有非高级类型都有DataSerializer,您不需要混合任何内容。