Scala:返回参数化类型的默认值

时间:2013-02-13 05:44:16

标签: scala

在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的“空”或“默认”值?它甚至可能吗?

2 个答案:

答案 0 :(得分:6)

嗯,从技术上讲,这是不可能的,原因很简单,就是没有“默认”值这样的东西。

你给出的例子都是幺半数零,所以,使用Scalaz,你可以这样写:

def wrapMyFunction[A : Zero](foo: =>A):A = {
  ...
  catch { case e: Exception => // do not catch all throwables!
    implicitly[Zero[A]].zero
  }
}

另一种选择是实例化一个值。您可以使用ClassManifestClassTag(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 = ...