Deci, implicit prioritate se bazează pe doi factori: unul este despre domeniul de aplicare de declarația în sine având prioritate (aplicare Un extinde domeniul de aplicare/trăsătură B, sau domeniul de aplicare fiind un companion obiect de un tip extins de la un tip cu domeniu de aplicare B ca partenerul obiect). Celelalte pur și simplu menționează că declarația este mult mai specific decât declarația B. Acum, când a citit-o pentru prima dată am avut mai multe interpretări posibile în minte, mai ales având în vedere potențialul de parametri (implicit și nu) a implicit metoda și tipul de parametri. Experiența părea să mă învețe că aceasta înseamnă că tipul de valoarea returnată de O declarație, după toate tip de inferență/tapply, este un subtip de retur tip de declarație B. Deci, acest lucru este bine:
class A
class B extends A
implicit val A = new A
implicit val B = new B
implicitly[A]
De ce acest lucru nu a compila, atunci?
implicit class A(val toInt :Int) {
def ! = (1 /: (2 to toInt))(_ * _)
}
implicit class B(i :Int) extends A(i)
1.!
Atunci când acest lucru?
class A(val toInt :Int) {
def ! = (1 /: (2 to toInt))(_ * _)
}
class B(i :Int) extends A(i)
implicit val A = { i :Int => new A(i) }
implicit val B = { i :Int => new B(i) }
1.!
Este un alt caz de compilator lucrează în moduri misterioase'?