## Tuesday, April 27, 2010

### Implicit Parameter Resolution

This topic is a continuation of the previous implicit parameter topics:

This topic provides some explanation about how implicit parameters are resulted. There are very strict rules for which implicit value is to be applied to a implicit parameter. A simple way to think about it is that the "closest" definition will be used. Local scope, enclosing class, parent class, companion object of the desired type.
`class X(val i:Int)class Y(val i:Int)object X {  implicit def xx = new X(1)}class Method {  def x(implicit x:X)=println(x.i)  def y(implicit y:Y)=println(y.i)}trait M {   self : Method =>  implicit def x1 = new X(10)  implicit def y1 = new Y(100)  def testy = y  def testx = x}trait SM extends M {  self : Method =>  implicit def x2 = new X(20)  implicit def y2 = new Y(200)    def testy2 = y  }// implicit resolved from companion object of Xnew Method().x// explicit applied so that value is usednew Method().x(new X(3))// implicit resolved from companion object of X// NOT from M.  This is because the call site of x // is not within M therefore does not use the implicits in M// for resolution.(new Method with M).ximplicit def x = new X(30)// local scope overrides companion object implicitnew Method().x// explicit applied so that value is usednew Method().x(new X(3))// local scope overrides companion object implicit(new Method with M).x// testy is defined within M so the implicits within M(new Method with M).testy// testx is defined within M so the implicit within M// overrides the companion object implicit(new Method with M).testx// testy is within M (not SM) so the implicit within M// is used(new Method with SM).testy// testy2 is within SM so the implicit within SM // overrides the implicit in M and the companion object(new Method with SM).testy2`
Output:

1
3
1
30
3
30
100
10
100
200

#### 1 comment:

1. # // testy is within M not SM so the implicit within SM
# // is used

Should it be:
# // testy is within M not SM so the implicit within M
# // is used

?