2016-05-12 99 views
3

我在Hadoop作业中收到了这个错误。
java.lang.NoSuchMethodException: <PackageName>.<ClassName>.<init>(<parameters>) 在大多数Scala代码中,您可以在编译时使用它。但是由于这个工作在运行时被调用,所以我在编译时没有捕获它。为什么Scala需要重复的构造函数? (java.lang.NoSuchMethodException)

我会认为默认参数会导致两个签名的构造函数被创建,一个采用单个参数。

class BasicDynamicBlocker(args: Args, evaluation: Boolean = false) extends Job(args) with HiveAccess { 
//I NEEDED THIS TOO: 
def this(args: Args) = { 
    this(args, false) 
} 

... }

我才知道,我需要声明使用this重载的构造艰辛的道路。 (我想写出来,以防其他人帮助。) 我也有一个小问题。对我来说,这似乎还是多余的。 Scala语言的设计限制是否有这个要求?

+1

一个很好的问题是:你如何调用构造函数? –

回答

4

,当你有,你会得到每个可能的情况下生成的默认参数的重载,例如像它不像:

def method(num: Int = 4, str: String = "") = ??? 

你期望编译器生成

def method(num: Int) = method(num, "") 
def method(str: String) = method(4, str) 
def method() = method(4, "") 

,但不是案子。

实际上,您将已生成的方法(在同伴对象),为每个默认PARAM

def method$default$1: Int = 4 
def method$default$2: String = "a" 

,每当你在你的代码说

method(str = "a") 

它只会被改为

method(method$default$1, "a") 

所以在你的情况下,签名this(args: Args)只是做了构造函数不存在,只有2个参数版本。

你可以在这里阅读更多:http://docs.scala-lang.org/sips/completed/named-and-default-arguments.html

相关问题