我有一组特征/类,例如:
trait Parent
case class ChildA(str: String) extends Parent
case class ChildB(str: String) extends Parent
object Parent {
implicit def toA(str: String) = ChildA(str)
implicit def toB(str: String) = ChildB(str)
}
对于 ChildA
或 ChildB
转换的情况,这可以正常工作。
在我的测试中,我想要一个额外的规则,如果一个方法接收到一个Parent
,它会执行如下操作:
implicit def toParent(str: String) = ChildA(str)
我该怎么做?编译器似乎感到困惑,因为它可以选择多次转换为父级。
最佳答案
如果您希望选择 toA
而不是 toB
来转换为 Parent
,您可以使用隐式优先级机制。如果隐式继承自类或特征,则它的优先级较低。
scala> :paste
// Entering paste mode (ctrl-D to finish)
trait Parent
case class ChildA(str: String) extends Parent
case class ChildB(str: String) extends Parent
trait LowerPiorityImplicits {
implicit def toB(str: String) = ChildB(str)
}
object Parent extends LowerPiorityImplicits {
implicit def toA(str: String) = ChildA(str)
}
// Exiting paste mode, now interpreting.
warning: there were two feature warnings; re-run with -feature for details
defined trait Parent
defined class ChildA
defined class ChildB
defined trait LowerPiorityImplicits
defined object Parent
scala> val foo: ChildA = "foo"
foo: ChildA = ChildA(foo)
scala> val foo: ChildB = "foo"
foo: ChildB = ChildB(foo)
scala> val foo: Parent = "foo"
foo: Parent = ChildA(foo)
关于scala - 类树的隐式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38124764/