我有以下操作: OpSUM
, OpAVG
, OpSTD
,...我想为 Int
, Float
, String
和其他类型实现。
蛮力的方式可能是这样的:
trait Operation
case class OpSUM[T: TypeTag]() extends Operation {
typeOf[T] match {
case t if t =:= typeOf[String] => Do some string work
case t if t <:< typeOf[Int] => Do some Int work
...
}
}
case class OpAVG[T: TypeTag]() extends Operation {
typeOf[T] match {
case t if t =:= typeOf[String] => Do some string work
case t if t <:< typeOf[Int] => Do some Int work
...
}
}
...
有更好的Scala方法可以做到这一点吗?
我在这里看到的主要问题是OP和类型是耦合的,这意味着每个操作类型都可以做不同的工作。
如果您尝试使用类型类方法(如他的评论中提出的@mrmcgreg),则可以看起来像:
trait OpSUM[T] {
def doSomeWork
}
object OpSUM {
implicit val stringCase: OpSUM[String] = new OpSUM[String] {
override def doSomeWork = ???
}
implicit def intCase[T <: Int]: OpSUM[T] = new OpSUM[T] {
override def doSomeWork = ???
}
}
trait OpAVG[T] {
def doSomeOtherWork
}
object OpAVG {
implicit val stringCase: OpAVG[String] = new OpAVG[String] {
override def doSomeOtherWork = ???
}
implicit def intCase[T <: Int]: OpAVG[T] = new OpAVG[T] {
override def doSomeOtherWork = ???
}
}
// ...
i也链接了丹尼尔·韦斯特海德(Daniel Westheide)对类型类的解释,因为他在其帖子中使用的应用域看起来与您的帖子相似。