1

我试图弄清楚为什么下面的类在 Scala 中编译时没有错误。我希望类中的createTestClass方法DoTest会因键入错误而失败,因为它试图提供具有 type 的隐式参数TypeClass[A],但它提供了一个带有 type 的 lambda 而不是这样的实例A => String

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

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

}
4

1 回答 1

1

Scala 2.12 引入了一个新特性:SAM(单一抽象方法)类型的 lambda 语法。这就是你在这里看到的。

于 2017-04-06T12:21:42.803 回答