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")
}