2016-10-19 18 views
0

プライベートコンストラクタを持つクラスに暗黙のパラメータを追加したいと思います。ここでは簡単な例として:プライベートコンストラクタと暗黙のパラメータを持つスカラクラス

class A[T] private(a:Int){ 
    def this()=this(0) 
} 

私はポン引きに発注[T]とTへマイライブラリパターンを適用したい場合、私はそうのようにバインドされ(非推奨)ビューを使用する必要があります:

class A[T <% Ordered[T]] private(a:Int){ 
    def this()=this(0) 
} 

これは機能します。しかし、廃止された構文的な砂糖を避けるために、暗黙のパラメータをクラスに渡したいと思います。残念ながら、これは私はおそらく間違って何かやっているところである:上記のコードについて

class A[T] private(a:Int)(implicit conv:T=>Ordered[T]){ 
    def this()=this(0) 
} 

を、コンパイラは次のエラーを生成します。

error: No implicit view available from T => Ordered[T]. 
     def this()=this(0) 

間、私は直接のような暗黙のパラメータを渡すしようとした場合そう:

class A[T] private(a:Int)(implicit conv:T=>Ordered[T]){ 
    def this()=this(0)(conv) 
} 

私はこれを取得:

error: not found: value conv 
     def this()=this(0)(conv) 

この場合、どのように暗黙的なパラメータを渡しますか?

EDIT:もう少し実験を重ねると、暗黙的なパラメータでコンストラクタを再定義することが問題になるようです。コンストラクタが非公開であるという事実ではありません。

答えて

3

私は答えを見つけて、例えば、私は明示的にパラメータなしのコンストラクタのための暗黙のパラメータを定義する必要があると思わ:

class A[T] private(a:Int)(implicit conv:T=>Ordered[T]){ 
    def this()(implicit conv:T=>Ordered[T])=this(0) 
} 

私はSOスパムをお詫び申し上げます、どのような場合には、私が提供する任意の答えを受け入れますより深い説明。

+1

、あなた自身の質問に答えることは完全に可能です。 –

+0

@Krleそれは私の本でかなり大きなコードのにおいです。 1つのコードを適切にインデントするのはいい場所ですが、私はそれをやりません。代わりに、私はこのオーバーロードされたコンストラクタを、同じ暗黙的な、コンパニオンの適用メソッドに移動します。 – flavian

+0

@flavianありがとう、私はそれをやるでしょう。なぜ、あなたは詳しく説明できますか?インデントおよびコンパニオンオブジェクトの両方... – Krle

3

スカラはOrderedの継承を使用し、もう1つは実際にはOrderingの型クラスを使用してコンテキスト境界を使用して、2つのフレーバで注文します。

あなたのアプローチは実際には慣用的ではなく、暗黙的に指定したものを実際に使用した場合、コンパイル時にあいまいな暗黙の例外が発生します。私はどうなるのか

は次のとおりです。

class A[T : Ordering] private(a: Int) 

これは実際の略記構文は次のとおりです。

class A[T] private(a: Int)(implicit ev: Ordering[T]) 

あなたはその後、明示的またはimplicitlyこの引数を使用することができます。 簡略化してT : Orderingという構文で定義するとします。

class A[T : Ordering] private(a: Int) { 
    def revSorter(list: List[T]): List[T] = { 
    list.sorted(implicitly[Ordering[T]].reverse) 
    } 
} 

あなたが「明示的な」構文を使用して定義した場合:謝罪する必要はありません

class A[T] private(a: Int)(implicit ev: Ordering[T]) { 
     def revSorter(list: List[T]): List[T] = { 
     list.sorted(ev.reverse) 
     } 
    } 
+0

はい、コンテキスト境界については同意しますが、主な点は暗黙的なパラメータでコンストラクタを再定義する方法に関するものでした。例ではOrdered [T]ではなく、汎用クラスBを使用していたはずです。 – Krle

関連する問題