我有以下两个测试用例:
测试案例1:
@Test
def testImplicit1(): Unit = {
class Person(val age: Int)
val func: Person => Int = p => p.age
implicit val x = func
val y = implicitly((p: Person) => Int)
println(func.hashCode())
println(x.hashCode())
println(y.hashCode())
}
x 和func具有相同的哈希码,而 y的哈希码与其他两个哈希码不同。
测试案例2:
@Test
def testImplicit2(): Unit = {
class Person(val age: Int)
implicit val p = new Person(10)
val p2 = implicitly[Person]
println(p.hashCode())
println(p2.hashCode())
}
p和p2具有相同的哈希码
我会问为什么y的哈希码与TEST CASE 1中的func和x不同
答案 0 :(得分:1)
implicitly
定义为:
def implicitly[T](implicit e: T): T = e
您在测试用例1中所做的是显式地将参数e的值(不是类型)传递为((p: Person) => Int)
,这是一个以Person
为参数并返回对象的函数{ {1}}。然后Int
只会将相同的值返回给您。
你想要的是:
implicitly
这将导致scala编译器使用隐式值val y = implicitly[Person => Int]
填充参数值e。