如何访问隐式“隐式”,即def a [A:B]或def a [A<%B]?

时间:2012-02-27 18:45:21

标签: scala implicit-conversion implicit

例如,我需要访问函数def a[A:ClassManifest]中的清单以获取擦除类。我可以使用Predef.implicitly函数,但在这种情况下,我的代码将与使用完整格式def a[A](implicit b:ClassManifest[A])一样长。 那些隐式参数是否有方便的生成名称?

2 个答案:

答案 0 :(得分:5)

Predef中有三种预定义方法可用于ManifestClassManifestOptManifestmanifest[T],{{1}分别和classManifest[T]。您可以根据相同的模式为其他类型类编写自己的“隐式getter”。这是例如optManifest[T]

manifest[T]

所以这就是你自己编写的方式:

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

答案 1 :(得分:0)

scalap救援!

我拿了这段代码:

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") }
}

并通过scalap运行它。这就是我得到的:

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 */ }
}

如您所见,第一个隐式Manifest称为evidence$1。第二个和第三个 - 虽然在不同的范围内! - 称为evidence$2evidence$3。所以...这就是你如何参考清单。

尽管如此,对我而言,删除类中较高级别的Manifest会改变文件中位于较低位置的Manifest的名称似乎有点吓人。类似地,IntelliJ Scala插件的语法突出显示似乎认为four()中范围内的清单变量是evidence$1evidence$2也没有帮助,并且它不认为evidence$3是一个有效的变量(即使它是,而evidence$1不是)。总的来说,也许应该注意这些事情作为关于使用隐式Manifest变量的警告信号?