Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 在Scala中更改函数的返回类型_Xml_Scala_Return Type_Scala Reflect - Fatal编程技术网

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

Xml 在Scala中更改函数的返回类型,xml,scala,return-type,scala-reflect,Xml,Scala,Return Type,Scala Reflect,我需要编写一个返回类型为NodeSeq(scala.xml.NodeSeq)的函数, 在下面的函数中,我试图通过使用下面的代码计算表达式来获取XML文件的NodeSeq。编译器抛出类型不匹配错误 import scala.reflect.runtime.universe def someFunc(params): NodeSeq = { some code .... val evaluator = universe.runtimeMirror(getClass.getClassLo

我需要编写一个返回类型为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?

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

以下代码已由路易斯·米格尔·梅西亚·苏亚雷斯(Luis Miguel Mejía Suárez)在对删除答案的评论中提交:

val数据:NodeSeq=evaluator.eval(evaluator.parse(expression))匹配{
案例n:NodeSeq=>n
case=>NodeSeq.Empty
}
在某些情况下,如果您没有考虑所有可能的情况(
匹配可能不是详尽的
),编译器将警告您。如果在模式匹配中使用无效类型(如
List[String]
而不是
List[Int]
),Intellij Idea和SBT都会警告您

您不应该将字符串(
data.getClass.getName
)与类(
scala.xml.NodeSeq
)进行比较,因为您将得到编译错误。不建议使用类名来检查类(如
data.getClass.getName==“scala.xml.NodeSeq”
),因为至少编译器不会检查它,而且如果
数据==null
,您将得到
NullPointerException

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


对不起,我的英语不好。

请尝试使用,而不是检查类名。当然,你不应该将字符串与类进行比较:它是不同的类型。谢谢@MikhailIonkin,我现在可以更改返回类型了。另外,请您将此作为答案发布,以便我可以接受您的解决方案并关闭此问题。好的,我发布了它。感谢@Mikhail提供的信息,我开始学习Scala,很高兴知道,这些细节,不要抱歉,我能够清楚地理解您的意思。