Scala spec 2.8 dit à la section 7.3 (mise en évidence est le mien):Pourquoi la conversion implicite de Long vers RichLong n'est-elle pas appliquée là où un supertype de RichLong est attendu?
paramètres implicites et méthodes peuvent également définir des conversions implicites appelées vues. Une vue du type S au type T est définie par une valeur implicite qui a le type de fonction S => T ou (=> S) => T ou par une méthode convertible en une valeur de ce type. Les vues sont appliquées dans deux situations.
- Si une expression e est de type T et T ne se conforme pas à pt type attendu de l'expression. Dans ce cas, un v implicite est recherché qui est applicable à e et dont le type de résultat est conforme à à pt. La recherche se déroule comme dans le cas de paramètres implicites, où la portée implicite est celle de T => pt. Si une telle vue est trouvée, l'expression e est convertie en v (e).
[...]
compte tenu de ce qui précède et les faits suivants:
Long
n'est pas un sous-type dejava.lang.Comparable[Long]
, à savoir ne sont pas conformes au typeT
oùT <: java.lang.Comaparable[Long]
Predef
contientimplicit def longWrapper (x: Long) : RichLong
RichLong
est un sous-type dejava.lang.Comparable[Long]
, à savoir est conforme au typeT
oùT <: java.lang.Comaparable[Long]
je me attends la conversion implicite à appliquer lorsque Long
est un sous-type et rencontré de java.lang.Comparable[Long]
est prévu. Cependant:
scala> def test[T <: java.lang.Comparable[Long]](c: T) = println(c)
test: [T <: java.lang.Comparable[Long]](c: T)Unit
scala> test(12L)
<console>:7: error: inferred type arguments [Long] do not conform to method test's type parameter bounds [T <: java.lang
.Comparable[Long]]
test(12L)
^
Le résultat est comme prévu si la valeur est convertie explicitement:
scala> test(longWrapper(12L))
12
Pourquoi pas la fonction de conversion appliquée implicitement?
Merci, il faudra lire sur les limites de type apparemment! –