我试图弄清楚为什么下面的类在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")
}
答案 0 :(得分:1)
Scala 2.12引入了一项新功能:lambda syntax for SAM (Single Abstract Method) types。这就是你在这里看到的。