什么时候必须包含抽象类型参数?

时间:2015-05-14 17:31:29

标签: scala

这是两段示例代码,找到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}}。差异的原因是什么?

1 个答案:

答案 0 :(得分:2)

在大多数情况下,两者都是等价的。

foo[T: ClassTag]()

的语法糖
 foo[T]()(implicit ct: ClassTag[T]

但是,这些签名之间的区别在于,在前者中,您必须通过ClassTag访问implicitly[ClassTag[T]],而在后者中,您只需使用{{ 1}}

语法更改备注: 在2.10.x之前,过去不可能同时拥有上下文绑定,如ctClassTag参数列表,例如:

implicit

错误曾被报告为"错误:不能同时具有隐式参数和上下文界限" 。 IntelliJ 13仍然在2.10.4之前报告它,但现在被scala编译器接受了。