如果Scala中的类型不相关,如何编写有效的类型有界代码

rei*_*kje 3 scala scala-2.10

我想改进以下与Cassandra相关的Scala代码.我有两个不相关的用户定义类型,实际上是在Java源文件中(省略了细节).

public class Blob { .. }
public class Meta { .. }
Run Code Online (Sandbox Code Playgroud)

以下是我目前使用Scala的方法:

private val blobMapper: Mapper[Blob] = mappingManager.mapper(classOf[Blob])
private val metaMapper: Mapper[Meta] = mappingManager.mapper(classOf[Meta])

def save(entity: Object) = {
  entity match {
    case blob: Blob => blobMapper.saveAsync(blob)
    case meta: Meta => metaMapper.saveAsync(meta)
    case _ => // exception
 }
}
Run Code Online (Sandbox Code Playgroud)

虽然这有效,但如何避免以下问题

  1. 添加新的用户定义类型类(如Blob或)时重复Meta
  2. 添加新方法时的模式匹配重复 save
  3. 具有Object参数类型

Gab*_*lla 5

你绝对可以Mapper用作类型类,做:

def save[A](entity: A)(implicit mapper: Mapper[A]) = mapper.saveAsync(entity)
Run Code Online (Sandbox Code Playgroud)

现在,你必须能够在所有类型进行保存操作的通用方法,A针对其Mapper[A]在范围.

此外,mappingManager.mapper可能可能会改进实施以避免classOf,但很难从当前状态的问题中分辨出来.