2017-03-07 15 views
1

私は暗黙のパラメータを持つクラスとして定義されている:Scalaの暗黙のクラス・パラメータ

class Test(implicit one: String) 

そして、私はそうのように、そのオブジェクトをインスタンス化したい:

val grr = new Test("aha") 

は、私は次の例外を取得します。

error: too many arguments for constructor Test:()(implicit one: String)Test 
     val grr = new Test("aha") 

しかし、私はそう

val grr = new Test()("haha") 
grr: Test = [email protected] 

のようにそれを呼び出す場合、私はテストオブジェクトを取得します。

暗黙のメソッドのScalaインスタンス化で、このインスタンスで空のパラメータでオブジェクトを呼び出す必要があるのはなぜですか?そのようなオブジェクトインスタンスに対して暗黙の空白のパラメータリストが表示されるのはなぜですか?

答えて

5

まず、Testは、ではなく、暗黙のクラスです。暗黙のクラスについては、thisを参照してください。

代わりにTestは、明示的なコンストラクタ引数を持たず、1つのimplicit String引数を持つクラスです。これは、Testをインスタンス化できる唯一の方法は、暗黙の引数を明示的に指定することです。これは、扱いにくく、目的を無効にするか、Stringをインスタンス化時にimplicitスコープに入れてコンパイラに "pick itアップ。"言い換えれば

、あなたがスコープでこのようなものがある場合:

implicit val s: String = "haha" 

を次にあなたがTestをインスタンス化するために行う必要がありますすべてはこれです:

val grr = new Test 

そして、あなたがいない場合スコープが1つあれば、コンパイラはそれをあなたに知らせます。それはいいことだ。

しかし、主なことは、暗黙的なパラメータと暗黙的なクラスの区別を確実にすることです。

+0

申し訳ありませんが、正に正しい説明を使用していたはずです... – noname

0

暗黙の空白パラメータリストはコンストラクタのためだけにあり、すべてのメソッドではありません。これはおそらくパーサが型Test(またはコンパニオンオブジェクト)への参照とコンストラクタへの参照を区別する必要があるためです。引数を持たないコンストラクタが許可されていれば、Test自体はあいまいです。

import Container._ 

、それは暗黙的にテストオブジェクトに文字列を変換します:

object Container { 
    implicit class Test(val one: string) 
} 

が次にあなたが行うことができます:あなたは「暗黙のクラス」を参照してくださいScalaでは通常

あなたはこのようにそれを行います。

+0

右ですが、暗黙的に文字列をテストクラスに変換するのではなく、特定のスコープ内のクラスに暗黙的なパラメータをカプセル化する暗黙的なパラメータをカプセル化したいと考えています。私の例は少し工夫されたと思う。私はちょっとあなたが混乱していると思うのですが、テストはコンストラクタなしで曖昧であると言っています - オブジェクトとあいまいで、クラスで作成されたTestですか? – noname

関連する問題