scala类中的隐式apply方法

时间:2017-10-16 20:52:58

标签: scala apply implicit

我正在学习scala implicits。 在下面的示例代码中,不会自动调用隐式应用:

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范围内的隐含参数可用时,为什么不会隐式调用apply?

3 个答案:

答案 0 :(得分:2)

您可以添加空参数列表,这将起作用:

Main()
{
   setMouseCallback("WinName", onMouse, 0);

   setMouseCallback("WinName", DrawLine, 0);

// capture first frame of video
   cap >> frame;

 // set midpoint when  onMouse is called

 // set coordinates of the line  when DrawLine is called

  while (true)
  {
       cap >> frame;

      // do the rest of your stuff here 
  }

}

此处 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的类型为e,且S不符合表达式的预期类型S

     

•如果选择器T未表示e.m的成员,则选择e S类型为m的选项。

     

在第一种情况下,搜索适用的转化S   到c,其结果类型符合e。在第二种情况下,a   搜索适用于T及其结果的转化c   包含名为e的成员。

来自here

在您的代码中,没有任何一种情况。

案例1不适用,因为mapply。案例2不适用,因为没有隐式转换String => String

答案 1 :(得分: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)

答案 2 :(得分:0)

class A中定义隐式方法时,这与定义此类的隐式转换完全不同。

它可以作为定义范围内的隐式使用,但它是从StringString的隐式转换,编译器没有任何理由可以隐式使用。