Pourquoi est-conversion implicite de Long à RichLong pas appliquée lorsqu'un super-type de RichLong est prévu?

StackOverflow https://stackoverflow.com/questions/3586044

  •  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.

     
      
  1. 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).
  2.   
     

[...]

étant donné ce qui précède et les faits suivants:

  1. Long est pas un sous-type de java.lang.Comparable[Long], à savoir ne se conforme pas pour taper TT <: java.lang.Comaparable[Long]
  2. Predef contient implicit def longWrapper (x: Long) : RichLong
  3. RichLong est un sous-type de java.lang.Comparable[Long], à savoir conforme pour taper TT <: 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?

Était-ce utile?

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é").

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top