scala - 类树的隐式转换

标签 scala

我有一组特征/类,例如:

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)
}

对于 ChildAChildB 转换的情况,这可以正常工作。

在我的测试中,我想要一个额外的规则,如果一个方法接收到一个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/

相关文章:

java - 阻止在 java(或 scala)中创建文件

scala - 无所苦

使用 Play 框架 2.3 时出现 java.lang.IllegalArgumentException

scala - Scala 如何在这里使用我的所有内核?

scala - Spark-cassandra-connector:toArray 不起作用

scala - 使用 sttp 的多部分表单数据请求 - Scala HTTP 客户端

scala - 从 Spark 中具有不同架构的现有数据帧创建另一个数据帧

scala - 启动scala脚本的两种方式,哪种方式更可取?

scala - 减少 Spark 中的数据框以省略空单元格

Scala:为什么一个方法不能有多个可变参数?