scala类中的隐式apply方法

scala类中的隐式apply方法,scala,apply,implicit,Scala,Apply,Implicit,我正在学习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

我正在学习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作用域中可用时,请建议为什么不隐式调用apply?

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

  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

•在类型为
S
e
选择
e.m
中,如果选择器
m
不表示
S
的成员

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

在您的代码中,这不属于任何情况


案例1不适用,因为
apply
String=>String
。案例2不适用,因为没有隐式转换
A=>{def toUpperCase}

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

  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

•在类型为
S
e
选择
e.m
中,如果选择器
m
不表示
S
的成员

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

在您的代码中,这不属于任何情况

案例1不适用,因为
apply
String=>String
。案例2不适用,因为没有隐式转换
A=>{def toUpperCase}

您可以尝试以下操作:

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)
您可以尝试以下方法:

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)

当您在
类A
中定义隐式方法时,这与从该类定义隐式转换完全不同


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

当您在
类A中定义隐式方法时,这与从该类定义隐式转换完全不同

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