【发布时间】:2018-10-06 10:08:03
【问题描述】:
我需要帮助理解这种类型签名:
def func[A : Ordering : ClassTag](a: A) = ???
我已经使用上面的类型签名提出了虚拟示例......以及我更熟悉的类型签名,我相信这与基于我的虚拟示例的相同,但我可以还想出了一个玩具例子,它们显然不一样。
这两个看起来很相似:
import scala.reflect.ClassTag
// type signature in question
def func1[A : Ordering : ClassTag](elems: A*) =
Array[A](elems: _*).sorted
// my typical type signature
def func2[A <% Ordered[A]](elems: A*)(implicit c: ClassTag[A]) =
Array[A](elems: _*).sorted
使用示例:
class BB(val i: Int) extends Ordered[BB] {
def compare(that: BB): Int = that.i - i
override def toString = s"BB(${i})"
}
func1(new BB(33), new BB(100), new BB(-1))
func2(new BB(33), new BB(100), new BB(-1))
每个的输出是:
Array[BB] = Array(BB(100), BB(33), BB(-1))
我可以提出它们不同的一个极端情况......表明一个不仅仅是另一种的语法糖......如下,其中函数具有与类不同的类的隐式顺序自然排序顺序。
此示例(如下)运行良好,implicit val ordering 覆盖了我(有点)预期的 BB 类的自然排序顺序。
def func3[A <% Ordered[A] : ClassTag](elems: A*) = {
// opposite order defined in class BB
implicit val ordering: Ordering[A] =
Ordering.by{ case bb: BB => bb.i }
Array[A](elems: _*).sorted
}
这个版本(下)给我报错...
def func3[A : Ordering : ClassTag](elems: A*) = {
// opposite order defined in class BB
implicit val ordering: Ordering[A] =
Ordering.by{ case bb: BB => bb.i }
Array[A](elems: _*).sorted
}
错误:不明确的隐含值:两者都是 Ordering[A] 类型的值 evidence$1 和 Ordering[A] 类型的值排序匹配预期类型 scala.math.Ordering[A]
因此基于此...我猜: Ordering 将Ordered[BB] 转换为implicit val ordering...或类似的东西?我的玩具示例未能揭示出更深层次的差异吗?
提前致谢。
【问题讨论】:
标签: scala types polymorphism