案例对象的scala隐式转换

问题描述 投票:0回答:1

我指的是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个回答
1
投票

这在帖子中回答:

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.