2017-10-04 13 views
2

暗黙の検索のこのケースを理解しようとしています - finding implicit of an argument's type。私は、IDEに公式の例を貼り付け、コピーして、ちょうどこのようMULにメソッド名を変更:スカラ暗黙の引数の型の検索に失敗する

value mul is not a member of Int 

私も試してみました:

class A(val n: Int) { 
    def mul(other: A) = new A(n + other.n) 
} 
object A { 
    implicit def fromInt(n: Int) = new A(n) 
} 
1 mul (new A(1)) 

今では、と言って、コンパイルエラーになりますの代わりに文字列を試して、コンパイルエラーが発生しました。

私が間違っていることを説明できますか?

答えて

3

def +(other: A) =...def mul(other: A) =...の違いはInt+メソッドを持っていますが、それはmulメソッドを持っていないということです。

メソッドが存在し、渡される引数の型に対応しない場合、コンパイラは暗黙の変換を探します。暗黙のスコープには、渡されたパラメータ引数の付随オブジェクトが含まれます。暗黙の変換が見つかった場合、式全体が変換のために評価されます。

このメソッドが存在しない場合、コンパニオンオブジェクトの暗黙の変換は暗黙のスコープ内にありません。それは見つからず、変換も行われません。

implicit def fromInt(...をコンパニオンオブジェクトの外に移動すると、mul()変換が行われます。

+0

うわー、ありがとう!それがまさに問題でした。メソッド名は、implicitsが適用される前にオブジェクトに既に存在しているはずです。 –

+1

非常に興味深い、この種の解像度が有用なのはいつですか? @マイケル; – Mikel

+1

;それは良い質問です。暗黙のスコープ規則がどのように/どうして決定されたのかわかりません。私はこのことについて少し驚いた。 – jwvh

関連する問題