Scala 隐式转换选项[T]到字符串

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.

我试图使用隐式将scala中的选项值转换为字符串,但不知怎的,它起作用了。这是我的语法-

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)
就可以了。酷。。我喜欢。谢谢