我想改进以下与 Cassandra 相关的 Scala 代码。我有两个不相关的 user defined types它们实际上在 Java 源文件中(省略了细节)。
public class Blob { .. }
public class Meta { .. }
下面是我目前在 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
}
}
虽然这可行,但您如何避免以下问题
- 在添加新的用户定义类型类(如
Blob
或Meta
)时重复 - 添加
save
等新方法时的模式匹配重复 - 将
Object
作为参数类型
最佳答案
你绝对可以使用 Mapper
作为类型类,做:
def save[A](entity: A)(implicit mapper: Mapper[A]) = mapper.saveAsync(entity)
现在您有了一个通用方法,能够对 Mapper[A]
范围内的每个类型 A
执行保存操作。
此外,mappingManager.mapper
实现可能会得到改进以避免 classOf
,但很难从当前状态的问题中分辨出来。
关于scala - 如果类型在 Scala 中不相关,如何编写高效的类型有界代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26657220/