2016-05-19 5 views
3

私はscalaが新しく、いくつかのhandson演習を試みています。scala implicitは使用時にのみインポートされます

私はインプリシットをコンパニオンオブジェクトに配置することによってインプリシットを使用しようとしています。ただし、コンパイラは暗黙的に検出されません。

class ImplicitTest { 
    import Implicits.implicitInt; 
    println(implicitInt) 
    def implicitm1(implicit i : Int) = 1 
    println(implicitm1) 
} 
object Implicits { 
    implicit val implicitInt = 1 
} 

これはうまくコンパイルされます。私は

\\println(implicitInt)` 

三行目をコメントアウトする場合は、その後、私は

println(implicitm1)` 

にコンパイル時にエラーになります

could not find implicit value for parameter i:Int` 

not enough arguments for method implicit m1(implicit i:Int) . Unspecified value parameter i` 

は、私がここで間違って何をした?言っていますか事前

答えて

4

おかげであなたはval implicitInt: Int = 1の型が含まれている場合、それは動作します。このような問題は、implicの型を常に指定することが推奨される理由の1つです。

スカラ型推論は上から下へと動作しますので、コンパイラはprintln(implicitm1)行を型検査するときにこの型をまだ知っていません。

println(implicitInt)を含めると、コンパイラはその行にimplicitIntの型を見つけることが強制されます。

0

もう1つの解決策は、Implicits定義をImplicitTestクラスの上に移動することです。

この場合、implicitIntの型はすでに推測されています。

関連する問題