Scala 意外地编译了一个文件,是否存在隐式转换?

Scala unexpectedly compiles a file, are there implicit conversions at work?

我想弄清楚为什么下面的 classes 在 Scala 中编译没有错误。 我希望 DoTest class 中的 createTestClass 方法因输入错误而失败,因为它试图提供类型为 TypeClass[A] 的隐式参数,而不是这样的例如,它提供类型为 A => String.

的 lambda

这里有隐式转换吗?我将如何着手弄清楚发生了什么?

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

}

Scala 2.12 引入了一项新功能:lambda syntax for SAM (Single Abstract Method) types。这就是您在这里看到的。