Pourquoi est-conversion implicite de Long à RichLong pas appliquée lorsqu'un super-type de RichLong est prévu?
-
01-10-2019 - |
Question
spec Scala 2.8 dit à la section 7.3 (mise en évidence est le mien):
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 un procédé pouvant être converti en une valeur de ce type. Les vues sont appliquées dans deux situations.
- Si un e d'expression est de type T et T ne se conforme pas pour les années d'expression attendu pt de type. Dans ce cas, un v implicite est recherché qui est applicable à e et dont le résultat est conforme de type pour pt. La recherche se déroule comme dans le cas de paramètres implicites, où la portée implicite est l'un des T => pt. Si une telle vue est trouvé, l'expression e est converti en v (e).
[...]
étant donné ce qui précède et les faits suivants:
-
Long
est pas un sous-type dejava.lang.Comparable[Long]
, à savoir ne se conforme pas pour taperT
oùT <: java.lang.Comaparable[Long]
-
Predef
contientimplicit def longWrapper (x: Long) : RichLong
-
RichLong
est un sous-type dejava.lang.Comparable[Long]
, à savoir conforme pour taperT
oùT <: java.lang.Comaparable[Long]
J'attendre la conversion implicite à appliquer lorsque Long
est rencontré et un sous-type 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 ne pas la fonction de conversion appliquée implicitement?
La solution
Vous devez utiliser une vue liée (<%
) avoir compilateur chercher à appliquer la conversion implicite.
scala> def test[T <% java.lang.Comparable[Long]](c: T) = println(c)
test: [T](c: T)(implicit evidence$1: (T) => java.lang.Comparable[Long])Unit
scala> test(12L)
12
Vous pouvez en savoir plus sur le point de vue lié cette page (Ctrl + F pour "vue lié").