2016-09-08 11 views
0

以下の3つの例のうち1つだけが動作している理由を理解できませんか?何が他の2つに間違っているのですか?スカラクラスコンストラクタのimplicits

class H(implicit a:String, b: Int) { 
    //Working 
} 

class H(a:String, implicit b: Int) { 
    //Not-Working 
} 

class H(implicit a:String, implicit b: Int) { 
    //Not-Working 
} 

答えて

2

にValまたはVARが必要です。これは、 "abは、コンストラクターを呼び出すときに暗黙的に提供される"ことを意味します(クラス本体に暗黙的にも使用可能になります)。この意味で、クラスまたはメソッドの単一のパラメータを作成することはできません。implicit

implicitの2番目の使用は、タイプ/オブジェクトメンバーをマークすることです。コンストラクタパラメータはメンバではありませんが、pamuの答えと同様に、val/varを使用してメンバにすることができます。または表示されないように、private[this] val

0
class H1(implicit a:String, b: Int) { 
    //Working 
} 

aではなく全体のパラメータリストを参照していない最初のケースimplicitでは2例以下

class H2(a:String, implicit val b: Int) { 
    //Working 
} 

class H3(implicit a:String, implicit val b: Int) { 
    //Working 
} 
+1

'class H2(a:String、暗黙のval b:Int)'はコンパイルされますが、実際には暗黙的になりません –

+1

@Łukasz 'b'は暗黙的にクラス内に宣言されます。 _both_ 'a'と' b'が内外で暗黙的になり、コンストラクタが 'new H3()(" 123 "、456)'に変わる 'H3'ではさらに興味深いことが起こります。暗いコーナーでは、そこに潜んでいるものは決して分かりません。 –

関連する問題