我想知道是否有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]
如何重新安排上述代码以避免额外的演员?
答案 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]
。