[英]implicit apply method in scala class
我正在學習scala隱式。 在下面的示例代碼中,隱式Apply不會自動被調用:
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
•在選擇
em
與e
類型的S
,如果選擇器m
並不表示的成員S
。在第一種情況下,搜索轉換
c
,該轉換c
適用於e
且結果類型符合T
在第二種情況下,搜索適用於e
且結果包含名為m
的成員的轉換c
。
從這里 。
在您的代碼中,情況並非如此。
情況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)
當您在class A
定義隱式方法時,這與在此類中定義隱式轉換完全不同。
它可以在定義它的作用域中用作隱式,但是它是從String
到String
的隱式轉換,編譯器沒有任何理由要隱式使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.