首页 > 解决方案 > 在 Scala 中设置行为

问题描述

今天我注意到 Scala 对它自己的 Set 类型的行为与其包装的集合(至少 SetWrapper)不同。我有一个利用现有 Java 代码的应用程序,该代码在 Java 集上执行简单的“包含”。因此,当从 Scala 调用时,我使用 scala.collection.JavaConverters 来获取将 Java 集传递给此函数 (SetWrapper) 所需的隐式。但是,正在检查集合中是否存在的值可能是 Java 空值。似乎将空值传递给 SetWrapper.contains 方法会导致 NPE。这是来自 SetWrapper.contains 的有问题的片段:

override def contains(o: Object): Boolean = {
  try { underlying.contains(o.asInstanceOf[A]) }
  catch { case cce: ClassCastException => false }
}

似乎 asInstanceOf 调用导致了 NPE。如果是 Scala,我使用的是 2.11.8 版本。有谁知道这是否已在以后的版本中解决?我没有找到任何关于这个问题的参考。

*** 更多信息

广播 SetWrapper 时,Spark 节点上发生错误。如果发送'native' Scala Set 并在节点上调用'asJava' 方法,则没有问题。显然 SetWrapper 在通过网络广播时不会序列化底层的 Scala 集,它最终在目标节点上为空。

标签: scala

解决方案


推荐阅读