2017-07-06 81 views
0

我有以下兩個測試用例:隱含值是不一樣的隱式[功能2]

TEST CASE 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具有相同的散列碼

我會問爲什麼Ÿ的哈希碼是在測試用例FUNC和X的不同1

回答

1

implicitly定義如:

def implicitly[T](implicit e: T): T = e 

你在做什麼測試用例1是明確的tly傳遞參數e的值(不是類型),作爲((p: Person) => Int)這是一個函數,它將Person作爲參數並返回對象Int。然後implicitly只是將相同的值返回給您。

你想要的是:

val y = implicitly[Person => Int] 

這將導致Scala編譯器,填補了參數值e與內含價值x

+0

你是對的..謝謝! – Tom