簡體   English   中英

如何訪問隱式“隱式”,即def a [A:B]或def a [A <%B]?

[英]How can I access implicit “implicit” i.e. def a[A :B] or def a[A <% B]?

例如,我需要訪問函數def a[A:ClassManifest]清單以獲得擦除類。 我可以使用Predef.implicitly函數,但是在那種情況下,我的代碼將和使用完整格式def a[A](implicit b:ClassManifest[A]) 那么,這些隱式參數是否有方便生成的名稱?

有三個預定義的方法Predef將做到這一點對Manifest S, ClassManifest S和OptManifest S: manifest[T] classManifest[T]optManifest[T]分別。 您可以根據相同的模式為其他類型類編寫自己的“隱式獲取器”。 例如manifest[T]

def manifest[T](implicit m: Manifest[T]) = m

因此,這是您可以編寫自己的方法:

trait UsefulTypeclass[A] {
  def info = 42 // sample method
}

// the “implicit getter”
def usefulTypeclass[A](implicit tc: UsefulTypeclass[A]) = tc

// a method that uses the implicit getter
def foo[A: UsefulTypeclass] =
  usefulTypeclass[A].info

急救頭皮!

我把這段代碼:

object TestThing extends App {
  def one { println("one") }
  def two[T] { println("two") }
  def three[T : Manifest] { println("three") }
  def four[T: Manifest, U : Manifest] { println("four") }
}

並通過頭皮運行。 這是我得到的:

object TestThing extends java.lang.Object with scala.App with scala.ScalaObject {
  def this() = { /* compiled code */ }
  def one : scala.Unit = { /* compiled code */ }
  def two[T] : scala.Unit = { /* compiled code */ }
  def three[T](implicit evidence$1 : scala.Predef.Manifest[T]) : scala.Unit = { /* compiled code */ }
  def four[T, U](implicit evidence$2 : scala.Predef.Manifest[T], evidence$3 : scala.Predef.Manifest[U]) : scala.Unit = { /* compiled code */ }
}

如您所見,第一個隱式清單被稱為evidence$1 第二個和第三個- 盡管范圍不同! -稱為evidence$2evidence$3 所以...這就是您引用清單的方式。

盡管如此,對於我來說,刪除類中較高級別的清單將更改文件中較低位置的清單的名稱對我來說還是有點嚇人。 同樣,IntelliJ Scala插件的語法突出顯示似乎認為four()范圍中的Manifest變量是evidence$1evidence$2 ,並且也不認為evidence$3在這里是有效變量也無濟於事(即使是,而evidence$1不是)。 總的來說,也許這些事情應該作為有關使用隱式Manifest變量的警告標志而引起注意?

暫無
暫無

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

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