为什么scala需要重复的构造函数(java.lang.nosuchmethodexception(异常)

z0qdvdin  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(440)

我在hadoop工作中收到了这个错误。 java.lang.NoSuchMethodException: <PackageName>.<ClassName>.<init>(<parameters>) 在大多数scala代码中,您可以在编译时使用它。但由于这个作业是在运行时调用的,所以我没有在编译时捕获它。
我认为默认参数会导致创建具有两个签名的构造函数,其中一个使用单个参数。

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语言的设计限制要求这样做有什么原因吗?

sh7euo9m

sh7euo9m1#

当您使用默认参数时,您不会为每个可能的情况生成重载,例如:

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

您希望编译器生成

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

但事实并非如此。
您将为每个默认参数生成方法(在companion对象中)

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

相关问题