在scala中使用Option.fold时避免强制转换

时间:2015-12-03 05:05:06

标签: scala

我想知道是否有Option.fold的构造会导致以下None.**.asInstanceOf[Option[String]**不必要:

def getHiveDir(sqlc: SQLContext, tname: String, partColVals: Seq[(String, String)]): Option[String] = {
     getHiveDir(sqlc, tname).fold(None.asInstanceOf[Option[String]]) { tloc =>
           // some stuff
  }
  Some(someString)
 }

目前,上述.asInstanceOf[Option[String]]是必需的或发生编译错误:无法识别为Option[String]

如何重新安排上述代码以避免额外的演员?

2 个答案:

答案 0 :(得分:5)

选择你最喜欢的:

scala> Option.empty[String]
res1: Option[String] = None

scala> None: Option[String]
res2: Option[String] = None

scala> None.asInstanceOf[Option[String]]
res3: Option[String] = None

您还可以为fold明确定义类型参数:

scala> val o: Option[Int] = None
o: Option[Int] = None

scala> o.fold[Option[Int]](None)(_ => Some(2))
res5: Option[Int] = None

在某些情况下,类型推断只是没有足够的信息来确定类型。它发生在像Haskell这样的其他语言中。所以常用的方法是使用:指定类型,或者通过显式传递类型参数,如上例所示。

答案 1 :(得分:0)

为了完整性:

如果您使用的是scalaz,则可以使用none[String]