2017-10-16 171 views
0

我正在學習scala implicits。 在下面的示例代碼,隱敷沒有得到自動調用:隱式應用方法在scala類中

package learn 

object ImplicitApplyInClass { 

    def main(args: Array[String]): Unit = { 


    implicit val ss = "abc" 

    //This is working 
    val a = A(1).apply.toUpperCase 

    //This is giving compile time error 
    //val b = A(1).toUpperCase 
    } 
} 

case class A(id: Int) { 
    implicit def apply(implicit s: String) = { 
    s.toUpperCase  
    } 
} 

請說明爲什麼申請是沒有得到隱含地調用,當隱含參數THR範圍內可用?

回答

1

您可以添加空參數列表,這將工作:

case class A(id: Int) { 
    implicit def apply()(implicit s: String) = { 
     s.toUpperCase 
    } 
    } 

    val b = A(1)().toUpperCase 
    println(b) // ABC 

這裏apply工作不作爲的隱式轉換。從S型鍵入T

的隱式轉換由具有功能類型S => T,或通過隱式方法 轉換爲該類型的值的隱式 值來定義。

隱式轉換在兩種情況下適用於:

•如果一個表達式eS類型,S不符合表達式的預期類型T

•在選擇e.mS類型的e,如果選擇器m並不表示的S成員。

在第一種情況下,搜索適用於 至e並且其結果類型符合T的轉換c。在第二種情況下,將搜索 轉換c,該轉換適用於e,其結果 包含名爲m的成員。

here

在你的代碼中沒有這種情況。

由於applyString => String,所以不適用情況1。情況2不適用,因爲沒有隱式轉換A => { def toUpperCase }

0

你可以試試這個:

object ImplicitApplyInClass { 
    def main(args: Array[String]): Unit = { 
    implicit val ss = "abc" 
    val b = A(1).toUpperCase 
    println(b) 
    } 
} 
object A { 
    implicit def f(a: A)(implicit s: String): String = s 
} 
case class A(id: Int) 
0

當你定義一個隱含的方法中class A這是不是在所有與從這個類中定義的隱式轉換。

它可以在其定義的範圍內隱式使用,但它是從StringString的隱式轉換,編譯器不會有任何理由隱式使用。