在Spark Scala API中检查集合中是否存在元素时出现类型不匹配错误
我定义了以下用Scala编写的函数,用于确定特定类型的节点(项目、过滤器)是否包含在给定的集合中:在Spark Scala API中检查集合中是否存在元素时出现类型不匹配错误,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,我定义了以下用Scala编写的函数,用于确定特定类型的节点(项目、过滤器)是否包含在给定的集合中: private val operators = Set(Project.getClass,Filter.getClass) def containsNode(plan: Seq[LogicalPlan]):Boolean= { for(p<- plan) { if(operators.contains(p.getClass))
private val operators = Set(Project.getClass,Filter.getClass)
def containsNode(plan: Seq[LogicalPlan]):Boolean=
{
for(p<- plan)
{
if(operators.contains(p.getClass))
true
}
false
}
我认为
p.getClass
将给出与设置运算符所期望的值相同的类型。但似乎不是这样。我是Scala和Spark的新手,所以我不确定这里到底发生了什么。有人能帮我修复这个错误吗?在这种情况下,问题是类型推断太精确,您可以通过明确地说操作符
是任何类的集合来修复它:
private val operators = Set[Class[_]](Project.getClass,Filter.getClass)
尽管第二个问题是,像那样仅仅使用true
并不会像您可能想要的那样返回它。您可以显式写入返回true
,但最好使用已包含所需逻辑的exists
:
def containsNode(plan: Seq[LogicalPlan]): Boolean =
plan.exists(p => operators.contains(p.getClass))
编辑:第三个可能的问题是Project中的Project
。getClass
不是类,而是它的伴生对象,您可能想要[Project]
的classOf.在这种情况下,问题是太精确的类型推断,您可以通过明确地说操作符
是任何类的集合来修复它:
private val operators = Set[Class[_]](Project.getClass,Filter.getClass)
尽管第二个问题是,像那样仅仅使用true
并不会像您可能想要的那样返回它。您可以显式写入返回true
,但最好使用已包含所需逻辑的exists
:
def containsNode(plan: Seq[LogicalPlan]): Boolean =
plan.exists(p => operators.contains(p.getClass))
编辑:第三个可能的问题是Project中的Project
。getClass
不是类,而是它的伴生对象,您可能想要[Project]
的classOf.您所说的“太精确的类型推断”是什么意思Project.getClass
和Filter.getClass
的公共超类型不是Class[\u]
,因为Project
和Filter
有一个公共超类型。什么叫“太精确的类型推断”?Project.getClass
和Filter.getClass
的公共超类型不是Class因为Project
和Filter
有一个共同的超类型。