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

时间:2017-04-06 12:17:19

标签: scala scala-implicits

我试图弄清楚为什么下面的类在Scala中编译时没有错误。 我希望createTestClass类中的DoTest方法因输入错误而失败,因为它尝试提供类型为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")

}

1 个答案:

答案 0 :(得分:1)

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