如何访问隐含的"隐含",即定义[A:B]或定义[A <%B]?

yur*_*ura 5 scala implicit implicit-conversion

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

Jea*_*let 5

有三种预定义的方法Predef,将做到这一点对ManifestS,ClassManifestS和OptManifestS: manifest[T],classManifest[T]optManifest[T]分别.您可以根据相同的模式为其他类型类编写自己的"隐式getter".这是例如manifest[T]:

def manifest[T](implicit m: Manifest[T]) = m
Run Code Online (Sandbox Code Playgroud)

所以这就是你如何写自己的:

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
Run Code Online (Sandbox Code Playgroud)

  • 作为一个巧妙的技巧:如果你将隐式getter命名为"apply"并将它放在UsefulTypeclass的伴随对象上,你可以使用"UsefulTypeclass [T]"作为表示T类型类实例的值,而不必导入任何东西.类型本身. (2认同)