2017-10-16 5 views
0

J'apprends des implica scala. Dans le code ci-dessous exemple, implicite apply ne reçoit pas automatiquement appelé:implicit apply method dans la classe scala

package learn 

object ImplicitApplyInClass { 

    def main(args: Array[String]): Unit = { 


    implicit val ss = "abc" 

    //This is working 
    val a = A(1).apply.toUpperCase 

    //This is giving compile time error 
    //val b = A(1).toUpperCase 
    } 
} 

case class A(id: Int) { 
    implicit def apply(implicit s: String) = { 
    s.toUpperCase  
    } 
} 

Veuillez expliquer pourquoi appliquer n'est pas se implicitement invoqué, lorsque le paramètre implicite est disponible dans Thr portée?

Répondre

1

Vous pouvez ajouter la liste des paramètres vide, ceci:

case class A(id: Int) { 
    implicit def apply()(implicit s: String) = { 
     s.toUpperCase 
    } 
    } 

    val b = A(1)().toUpperCase 
    println(b) // ABC 

Ici apply fonctionne pas comme une conversion implicite.

Une conversion implicite à partir du type ST au type est définie par une valeur implicite qui a le type de fonction S => T, ou par une méthode implicite convertible en une valeur de ce type.

conversions implicites sont appliquées dans deux situations:

• Si une expression est de type eS et S ne sont pas conformes au type attendu de l'expression T.

• Dans une sélection e.m avec e de type S, si le sélecteur m ne désigne pas un membre de S.

Dans le premier cas, une conversion c est recherché, qui est applicable à e et dont le type de résultat est conforme à T. Dans le second cas, une recherche c est recherchée laquelle s'applique à e et dont le résultat contient un membre nommé m.

De here.

Dans votre code, ce n'est pas le cas. Le cas 1 ne s'applique pas car apply est String => String. Le cas 2 n'est pas applicable puisqu'il n'y a pas de conversion implicite A => { def toUpperCase }.

0

Vous pouvez essayer ceci:

object ImplicitApplyInClass { 
    def main(args: Array[String]): Unit = { 
    implicit val ss = "abc" 
    val b = A(1).toUpperCase 
    println(b) 
    } 
} 
object A { 
    implicit def f(a: A)(implicit s: String): String = s 
} 
case class A(id: Int) 
0

Lorsque vous définissez une méthode implicite à l'intérieur class A ce n'est pas du tout la même chose que la définition d'une conversion implicite de cette classe.

Il est utilisable en tant qu'implicite dans la portée où il est défini, mais il s'agit d'une conversion implicite de String en String, que le compilateur n'aura aucune raison d'utiliser implicitement.