2016-05-12 8 views
3

私のHadoopジョブでこのエラーが発生しました。
java.lang.NoSuchMethodException: <PackageName>.<ClassName>.<init>(<parameters>) ほとんどのScalaコードでは、コンパイル時に使用します。しかし、この仕事は実行時に呼ばれるので、私はコンパイル時にそれをキャッチしていませんでした。Scalaに重複するコンストラクタが必要な理由(java.lang.NoSuchMethodException)

私は、デフォルトのパラメータは、両方のシグネチャを持つコンストラクタが1つの引数をとって作成されると思います。

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つのparamバージョンしかありませんでした。

あなたはここで多くを読むことができます:http://docs.scala-lang.org/sips/completed/named-and-default-arguments.html

関連する問題