这是两段示例代码,找到here:
scala> val im = m.reflect(new C)
im: reflect.runtime.universe.InstanceMirror = instance mirror for C@3442299e
和here:
scala> def mkArray[T : ClassTag](elems: T*) = Array[T](elems: _*)
第一段代码使用scala.reflect.api.Mirrors(找到here)中定义的方法:
abstract def reflect[T](obj: T)(implicit arg0: ClassTag[T]): Universe.InstanceMirror
如果您注意到,ClassTag
使用ClassTag[T]
,而ClassTag
使用{{1}}。差异的原因是什么?
答案 0 :(得分:2)
在大多数情况下,两者都是等价的。
foo[T: ClassTag]()
是
的语法糖 foo[T]()(implicit ct: ClassTag[T]
但是,这些签名之间的区别在于,在前者中,您必须通过ClassTag
访问implicitly[ClassTag[T]]
,而在后者中,您只需使用{{ 1}}
语法更改备注:
在2.10.x之前,过去不可能同时拥有上下文绑定,如ct
和ClassTag
参数列表,例如:
implicit
错误曾被报告为"错误:不能同时具有隐式参数和上下文界限" 。 IntelliJ 13仍然在2.10.4之前报告它,但现在被scala编译器接受了。