2017-10-16 174 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的隐式转换,编译器不会有任何理由隐式使用。