【问题标题】:Getting "incorrect number of arguments" when omitting parameter with default values in scala在scala中省略具有默认值的参数时获取“参数数量不正确”
【发布时间】:2014-01-23 07:46:52
【问题描述】:

对于以下构造函数的调用:

class SparkContext(
    val master: String,
    val appName: String,
    val sparkHome: String = null,
    val jars: Seq[String] = Nil,
    val environment: Map[String, String] = Map())
  extends Logging {

在下面的通知中,最后一个参数被注释掉了:

val spark = new SparkContext("localhost", "GroupBy Test",
  System.getenv("SPARK_HOME"), Seq(System.getenv("SPARK_EXAMPLES_JAR")) /* , Map() */)

然后scala编译器(2.9.2)抱怨:

not enough arguments for constructor SparkContext: (master: String, appName: String, sparkHome: String, jars: Seq[String], environment: scala.collection.Map[String,String])spark.SparkContext
    val spark = new SparkContext("localhost", "GroupBy Test",
                ^

如果取消注释,则代码编译。所以..这里有什么问题 AFA 省略了最后一个参数(并且 scala 使用默认值)?

注意我是 2.9.3

【问题讨论】:

  • 抱歉,我使用的是 Scala 2.10.3,我将您的代码复制并粘贴到 REPL,但代码运行时没有出现错误。 (只是在扩展日志中进行了修改)
  • 我在 2.9.3 我认为这就是区别(见@Vidya)
  • 很遗憾,@Naetmul,最新版本的 Spark 仅适用于 2.9.3。
  • 我不是 spark 用户,但是什么版本的 spark? ctor 从 0.6 变为 0.7 到 0.8。你怎么建? 0.6 缺少默认值。
  • 好吧,我从您的其他线程中看到您解决了编译问题。如果这个问题是虚假的,如果你回答这个问题会很好,或者如果有一个有趣的解决方案,你会回答它。

标签: scala default-value


【解决方案1】:

我在尝试使用 Scala 编译器的一个主要版本(第一个 + 第二个数字)和不同版本的库时看到了这个错误,例如2.9 编译器与 2.10 编译库。不幸的是,Scala 编译的库在 2.8、2.9 或 2.10 之间以及 2.8 的不同次要版本(不同的第三个数字)之间不兼容。换句话说,你所有的 Scala 库,以及你的代码本身,都必须使用相同的主要版本进行编译,对于 2.8.x,也必须使用相同的次要版本。从 2.10 开始的次要版本之间确实存在二进制兼容性,并且在大多数情况下是 2.9,尽管 2.9 系列中存在一些边缘情况。

【讨论】:

  • 我正在使用 2.9.3 针对宣传 2.9.2 的 spark 库进行编译。
  • “次要版本之间确实存在二进制兼容性(不同的第三个数字)。”仅从 2.10 开始! 2.9.* 彼此几乎 二进制兼容(如果我没记错的话,有一些极端情况),而 2.8.* 不是二进制兼容的。
  • 在这种情况下,你不应该看到这个问题,除非这是 Alexey 提到的“边缘情况”之一,这似乎值得怀疑(它几乎不会是边缘情况)。但是,您应该确认您确实在使用 2.9.3,并且您没有使用 any 2.10 系列库。如果您找到上述@som-snytt 的答案,您可以发布吗?您可以回答自己的问题。
猜你喜欢
  • 2020-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-27
  • 2017-06-20
  • 2018-02-09
  • 1970-01-01
相关资源
最近更新 更多