2010-08-27 2 views
4

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.

  1. 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:

  1. Long n'est pas un sous-type de java.lang.Comparable[Long], à savoir ne sont pas conformes au typeTT <: 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 est conforme au typeTT <: 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?

Répondre

5

Vous devez utiliser une vue liée (<%) pour que le compilateur recherche et applique 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 vue lié sur la page this (Ctrl + F pour "vue lié").

+0

Merci, il faudra lire sur les limites de type apparemment! –