在Scala中更改函数的返回类型

我需要编写一个返回类型为 NodeSeq(scala.xml.NodeSeq)的函数,
在下面的函数中,我试图通过使用以下代码评估表达式来获取XML文件的NodeSeq。编译器将引发类型不匹配错误。

import scala.reflect.runtime.universe

def someFunc(params): NodeSeq = {
  some code
  ....
  val evaluator = universe.runtimeMirror(getclass.getclassLoader).mkToolBox()
  val data: NodeSeq = evaluator.eval(evaluator.parse(expression))  // return type - Any

  if(data.getclass.getName == scala.xml.NodeSeq) data else NodeSeq.Empty
}

val数据理想情况下应该包含NodeSeq(根据我拥有的数据),但是我正在评估一个表达式,表达式的返回类型可以是任何东西,

我了解,为什么我不能使用上面的代码返回NodeSeq,
我能想到的最好的就是最后一个 if 条件。
有什么办法可以将该函数的返回类型从Any更改为NodeSeq?

wuzesc 回答:在Scala中更改函数的返回类型

当结果(或操作)取决于类型或值时,可以使用pattern matching。它是switch的更强大的版本。

下面的代码已经由Luis MiguelMejíaSuárez提交,已被评论删除:

val data: NodeSeq = evaluator.eval(evaluator.parse(expression)) match {
  case n: NodeSeq => n
  case _ => NodeSeq.Empty
}

在某些情况下,如果您未考虑所有可能的情况(match may not be exhaustive),编译器会警告您。如果您在模式匹配中使用无效的类型(例如List[String]而不是List[Int]),则Intellij Idea和SBT都会警告您。

您不应将String(data.getClass.getName)与Class(scala.xml.NodeSeq)进行比较,因为这样会导致编译错误。不建议使用类名来检查类(例如data.getClass.getName == "scala.xml.NodeSeq"),因为至少编译器不会检查它,并且如果NullPointerException会得到data == null

还有另一种方法:通过isInstanceOf检查班级。但是也不建议这样做,因为isInstanceOf不会检查泛型的类型:List(1).isInstanceOf[List[String]]将返回true

对不起,我的英语。

本文链接:https://www.f2er.com/2843996.html

大家都在问