我有以下操作:OpSUM
,OpAVG
,OpSTD
,...我想为Int
,Float
,{ {1}}和其他类型。
蛮力方式可能是这样的:
String
有更好的scala方式吗?
我在这里看到的主要问题是Op和类型是耦合的,这意味着对于每个操作,类型执行不同的工作。
答案 0 :(得分:2)
如果你尝试使用类型类(如他的评论中提出的@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 = ???
}
}
// ...
答案 1 :(得分:0)
我还链接了Daniel Westheide的this explanation of Type Classes,因为他在帖子中使用的应用程序域看起来与你的相似。