scala类中的隐式apply方法
我正在学习scala。 在下面的示例代码中,不会自动调用隐式应用: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
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
的隐式转换,编译器没有任何理由隐式使用它