Scala案例类:为类型构造函数案例生成实例?

时间:2015-02-06 16:48:04

标签: scala case-class type-constructor

我想使用一个泛型函数来返回给定类型的“默认值”。我已经在以下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

有任何建议如何使其有效吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

问题是Option[Float]不是Option[_],因为我们不知道_应该是什么。

您可以通过将defaultOption设为def并使用类型参数来解决此问题:

implicit def defaultOption[A] = DefaultOp[Option[A]](() => None)

scala> default[Option[Float]]
res3: Option[Float] = None
相关问题