隐式转换选项[T]到String

时间:2016-08-05 14:50:14

标签: scala

我试图使用隐式将scala中的选项值转换为String但不知何故它的工作原理。这是我的语法 -

object ToStringParser{
  implicit def optionAnyToString[T](input: Option[T]):String = {
    input match {
      case Some(i) => i.toString
      case None => "NULL"
    }
  }
}

我正在使用它 -

import domain.processors.ToStingParser._
println(submitDate)

但这总是打印 -

Some(2016-08-02T17:55:03.000-04:00)

我们如何隐含选项

3 个答案:

答案 0 :(得分:5)

您的问题是println接受Any类型的参数,因此无法知道您希望它使用隐式转换,您必须以某种方式告诉它您想要一个String,而不是Option

这样可行:println(submitDate: String), 这样:def puts(s: String) = println(s); puts(submitDate)

但与在这种情况下明确地执行此操作相比,它似乎并没有为您节省太多:

println(submitDate.getOrElse("NULL"))

这对读者来说会更加清晰。

答案 1 :(得分:1)

这里的问题是println对传递给它的任何内容都需要Any,这样你的隐式转换就不会被激活(它只是在其参数上调用.toString)。

但是,如果你这样做:

def f(x: String) = x
println(f(Some(1)))
println(f(None))

你会发现你的隐式转换实际上很有效。

答案 2 :(得分:1)

@Dima是对的。我只想扩展隐含机制。

println(x)接受String类型的参数以及Any

在您的情况下,println(x: Any)被调用,因为x的类型为Option[String],最终会调用并打印x.toString()。因此Some(...)结果。

您需要强制调用println(x: String)版本,该版本将强制从Option[T]隐式转换为String

因此你想要:

import domain.processors.ToStringParser._

val submitDate: Option[DateTime] = // ...
println(submitDate: String)