在Scala中考虑以下函数:
def wrapMyFunction[A](foo: =>A):A = {
try {
foo
}
catch { case e =>
//Return whatever the "empty" or "default" instance of type A would be,
//such as 0, "", None, List(), etc.
}
}
给定类型参数A,如何获得类型A的“空”或“默认”值?它甚至可能吗?
答案 0 :(得分:6)
嗯,从技术上讲,这是不可能的,原因很简单,就是没有“默认”值这样的东西。
你给出的例子都是幺半数零,所以,使用Scalaz,你可以这样写:
def wrapMyFunction[A : Zero](foo: =>A):A = {
...
catch { case e: Exception => // do not catch all throwables!
implicitly[Zero[A]].zero
}
}
另一种选择是实例化一个值。您可以使用ClassManifest
或ClassTag
(Scala 2.10.0)。例如:
def wrapMyFunction[A : scala.reflect.ClassTag](foo: => A): A = {
...
catch { case e: Exception =>
implicitly[scala.reflect.ClassTag[A]].runtimeClass.newInstance.asInstanceOf[A]
}
}
然而,这取决于无参数构造函数的存在。使用ClassManifest
几乎是一样的。
答案 1 :(得分:0)
正如丹尼尔所说,如果没有A
的某种类型限制,通常不可能。如何明确地或隐式地将方法更改为采用默认值:
def wrapMyFunction[A](foo: =>A, fallback: =>A):A = ...
或
def wrapMyFunction[A](foo: =>A)(implicit fallback:A):A = ...