Scala 隐式转换选项[T]到字符串
我试图使用隐式将scala中的选项值转换为字符串,但不知怎的,它起作用了。这是我的语法-Scala 隐式转换选项[T]到字符串,scala,Scala,我试图使用隐式将scala中的选项值转换为字符串,但不知怎的,它起作用了。这是我的语法- object ToStringParser{ implicit def optionAnyToString[T](input: Option[T]):String = { input match { case Some(i) => i.toString case None => "NULL" } } } 我用它就像- import domain.
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)
如何使用隐式for Options您的问题是
println
接受类型为Any
的参数,因此它无法知道您希望它使用隐式转换,您必须以某种方式告诉它您想要的是字符串,而不是选项
这将起作用:println(submitDate:String)
,
这也是:defputs(s:String)=println(s);放置(提交日期)
但在本例中,与直接执行相比,它似乎并没有为您节省太多:
println(submitDate.getOrElse("NULL"))
这对读者来说会更清楚。这里的问题是,println
对传递给它的任何内容都使用Any
,这样隐式转换就不会生效(它只调用.toString
参数)
但是,如果您这样做:
def f(x: String) = x
println(f(Some(1)))
println(f(None))
您将看到隐式转换实际上工作得很好。@Dima是正确的。我只想扩展一下隐式机制
println(x)
接受String
类型的参数以及Any
在您的例子中,调用了println(x:Any)
,因为x
属于Option[String]
类型,最终调用并打印了x.toString()
。因此产生了一些(…)
结果
您需要强制执行对println(x:String)
版本的调用,该版本将强制从选项[T]
到字符串的隐式转换
因此,您需要:
import domain.processors.ToStringParser._
val submitDate: Option[DateTime] = // ...
println(submitDate: String)
在这两种情况下都会出现错误-[error]found:Option[org.joda.time.DateTime][error]required:String[error]println(submitDate:String)案例2[error]found:Option[org.joda.time.DateTime][error]required:String[error]println(put(submitDate)),也可以使用println(submitDate.getOrElse(“NULL”),我需要对大约50个字符串执行此操作,然后用分隔符将它们连接起来。我想在Seq中添加这些,然后在mkString中添加delimiter。您的导入肯定有问题。你不应该得到任何错误。我只是在repl中尝试了一下,以确保它可以正常工作。至于连接50个字符串或诸如此类的东西,这并不能改变这样一个事实,即您从隐式转换中并没有得到多少好处:seqOfOptions.map(uu.getOrElse(“NULL”).toString).mkString(DELIMITER)
就可以了。酷。。我喜欢。谢谢