簡體   English   中英

Scala類中的隱式Apply方法

[英]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的隱式值定義,或者由可轉換為該類型的值的隱式方法定義。

隱式轉換適用於兩種情況:

•如果表達式eS類型,並且S不符合表達式的預期類型T

•在選擇eme類型的S ,如果選擇器m並不表示的成員S

在第一種情況下,搜索轉換c ,該轉換c適用於e且結果類型符合T 在第二種情況下,搜索適用於e且結果包含名為m的成員的轉換c

這里

在您的代碼中,情況並非如此。

情況1不適用,因為applyString => 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定義隱式方法時,這與在此類中定義隱式轉換完全不同。

它可以在定義它的作用域中用作隱式,但是它是從StringString的隱式轉換,編譯器沒有任何理由要隱式使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM