是的,这是可能的,但不是==
因为 Scala 仅支持以下情况的隐式转换:转换为预期类型、选择接收者的转换以及隐式参数,因此隐式不适用于比较情况。相反,您必须如下创建一个comparison method
。Command trait
sealed trait Command {
val typeName: String
def isEqual(c: Command) = c.typeName == this.typeName
}
object SendMessageCommand extends Command {
override val typeName: String = "send_message"
}
implicit def stringToCommand(s: String) = new Command {override val typeName: String = s}
implicit def commandToString(c: Command) = c.typeName
val strToCmdCompare = "send_message" isEqual SendMessageCommand
val cmdToStrCompare = SendMessageCommand isEqual "send_message"
println(strToCmdCompare) //print true
println(cmdToStrCompare) //print true
现在,来到你的第二个问题,是的,可以定义一个通用的隐式转换来将任何给定类型转换为另一个类型实例。但是,据我了解您的情况,您有命令对象列表,并且您希望这些对象中的特定命令具有给定的字符串名称。为此,您必须拥有这些实例列表。
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_message"
}
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)
}
val res: Option[Command] = "add_message"
println((res.getOrElse(null) == AddMessageCommand)) //print true
注意:当我通过将它们转换为 来比较转换中的两个类型实例时string
,我必须toString
为这个用例覆盖 Command 中的方法。T
如果类型不是字符串,您可能也需要这样做。此外,您可以根据需要实现自己的逻辑,convert method
而不是与toString
转换进行比较。