【问题标题】:scala implicit conversion for case object案例对象的scala隐式转换
【发布时间】:2019-02-20 17:57:04
【问题描述】:

我指的是Scala implicit conversion for object中发布的答案

sealed trait Command {
  val typeName: String
  //This is required for implicit conversion.
  override def toString: String = typeName
}

object SendMessageCommand extends Command {
  override val typeName: String = "send_message"
}
object AddMessageCommand extends Command {
  override val typeName: String = "add_message1"
}
object UpdateMessageCommand extends Command {
  override val typeName: String = "update_message"
}
object DeleteMessageCommand extends Command {
  override val typeName: String = "delete_message"
}

//List of commands.
implicit val cmds: List[Command] = List(SendMessageCommand, AddMessageCommand, UpdateMessageCommand, DeleteMessageCommand)

//Convert given type T into type U.
implicit def convert[T, U](s: T)(implicit list: List[U]): Option[U] = {
  list.find(_.toString == s.toString)
}

implicit val convert3: Command => String =
  (v: Command) => v.typeName

val res1:String = UpdateMessageCommand
val res: Option[Command] = "add_message1"

我创建了我的新转换器convert3,它可以转换 Command => String 。 上面的工作,但我不确定为什么用户为隐式转换覆盖了字符串

  //This is required for implicit conversion.
  override def toString: String = typeName

【问题讨论】:

    标签: scala implicit-conversion


    【解决方案1】:

    这在帖子中得到了回答:

    注意:由于我通过将它们转换为字符串来比较转换中的两个类型实例,因此我必须在此用例中覆盖 Command 中的 toString 方法。

    因为它是为泛型TU 编写的(并且它们没有边界),所以作者不能调用typeName

    但老实说,首先定义这样的隐式转换(convert,而不是convert3)是个坏主意。

    【讨论】:

    • 转换器implicit val convert3: Command => String = (v: Command) => v.typeName没有任何界限,如果不覆盖toString,它仍然无法工作
    • 是的,确实如此。您只需要一个触发它的上下文,例如val x: String = SendMessageCommand 你会看到的。无论您是否覆盖toString,它都会起作用(如果没有转换器,它不会)。
    • 但请注意,通常写成implicit def convert3(v: Command): String = v.typeName
    • 等等,你已经有了这个上下文。只需从问题中的代码中删除 toString 覆盖和最后一行,就可以看到它仍然可以编译:scalafiddle.io/sf/8ItX5lt/0。而如果你去掉convert3,最后一行会报错。
    猜你喜欢
    • 2013-04-13
    • 1970-01-01
    • 2018-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 1970-01-01
    相关资源
    最近更新 更多