我想使用一个泛型函数来返回给定类型的“默认值”。我已经在以下case类构造的帮助下实现了这个:
case class DefaultOp[T](op: () => T)
implicit val defaultString = DefaultOp[String](() => "")
implicit val defaultInt = DefaultOp[Int](() => 0)
implicit val defaultFloat = DefaultOp[Float](() => 0.0f)
implicit val defaultDouble = DefaultOp[Double](() => 0.0d)
// ...
def default[T]()(implicit ev: DefaultOp[T]): T = ev.op()
这样可以正常工作,但我想扩展它以处理从类型构造函数构造的类型。例如,我希望将任何选项类型的默认值设置为“None”,并将任何列表类型设置为Nil。我该怎么做呢?我的第一个问题:
implicit val defaultOption = DefaultOp[Option[_]](() => None)
编译,但是当我在应用程序中使用它时它不会编译:
error: could not find implicit value for parameter ev: DefaultOp[Option[Float]]
var test: Option[Float] = default[Option[Float]]
^
one error found
有任何建议如何使其有效吗?
谢谢!
答案 0 :(得分:2)
问题是Option[Float]
不是Option[_]
,因为我们不知道_
应该是什么。
您可以通过将defaultOption
设为def并使用类型参数来解决此问题:
implicit def defaultOption[A] = DefaultOp[Option[A]](() => None)
scala> default[Option[Float]]
res3: Option[Float] = None