2017-04-06 1 views
1

J'essaie de comprendre pourquoi les classes ci-dessous se compilent sans erreur dans Scala. Je m'attendrais à la méthode createTestClass dans la classe DoTest échouer avec une erreur de frappe car il essaie de fournir le paramètre implicite qui a le type TypeClass[A], mais au lieu d'une telle instance, il fournit un lambda avec le type A => String.Scala compile de manière inattendue un fichier, y a-t-il des conversions implicites au travail?

Y at-il une conversion implicite au travail ici? Comment pourrais-je comprendre ce qui se passe?

object Test { 

    trait TypeClass[A] { 
    def asString(a: A): String 
    } 

    object TypeClass { 
    def apply[A: TypeClass]: TypeClass[A] = implicitly[TypeClass[A]] 
    } 

    case class TestClass[A: TypeClass](foo: Option[A] = None) 

    object TestClass { 
    def apply[A: TypeClass]: TestClass[A] = TestClass[A]() 
    } 

} 

object DoTest { 
    import Test.TestClass 

    def createTestClass[A]: TestClass[A] = 
    TestClass.apply[A]((_: A) => "test") 

} 

Répondre