例如,我需要访问函数def a[A:ClassManifest]
中的清单以获取擦除类。我可以使用Predef.implicitly函数,但在这种情况下,我的代码将与使用完整格式def a[A](implicit b:ClassManifest[A])
一样长。
那些隐式参数是否有方便的生成名称?
答案 0 :(得分:5)
Predef
中有三种预定义方法可用于Manifest
,ClassManifest
和OptManifest
:manifest[T]
,{{1}分别和classManifest[T]
。您可以根据相同的模式为其他类型类编写自己的“隐式getter”。这是例如optManifest[T]
:
manifest[T]
所以这就是你自己编写的方式:
def manifest[T](implicit m: Manifest[T]) = m
答案 1 :(得分:0)
我拿了这段代码:
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$2
和evidence$3
。所以...这就是你如何参考清单。
尽管如此,对我而言,删除类中较高级别的Manifest会改变文件中位于较低位置的Manifest的名称似乎有点吓人。类似地,IntelliJ Scala插件的语法突出显示似乎认为four()
中范围内的清单变量是evidence$1
和evidence$2
也没有帮助,并且它不认为evidence$3
是一个有效的变量(即使它是,而evidence$1
不是)。总的来说,也许应该注意这些事情作为关于使用隐式Manifest变量的警告信号?