我正在实现一个数据结构,并希望用户能够使用任何类型作为键,只要他提供了一个合适的键类型来包装它。我有这种键类型的特征。这个想法是从基类型到键类型进行隐式转换,反之则(实际上)只使用基类型。特征如下所示:
trait Key[T] extends Ordered[Key[T]] {
def toBase : T
// Further stuff needed for datastructure...
}
object Key {
implicit def key2base[T](k : Key[T]) : T = k.toBase
}
呼叫站点代码可能如下所示:
def foo[K <% Key[K]]( bar : Seq[K] ) = bar.sorted(0)
计划是类型的值K应该隐式转换Key[K]为排序的值,或者应该分别隐式使用排序Key[K],所以一切都应该解决。当然,没有办法base2key在 trait 本身中实现隐式。或者是否存在,也许使用隐式传递的类清单?考虑到这一点,我找不到任何参考资料。
是否有可能以某种方式静态断言任何类型扩展Key[T]都将带有隐式转换T => Key[T]?可悲的是,伴生对象不能有抽象方法。
假设这可行,整个企业是否可行,或者所述用例是否需要多个链接的隐式转换?(正如我所读到的,链接不会发生。)
附录:Node(key : K, ...)有了上面的定义,我可以通过 using 对(下K <% Key[K])的序列进行排序sortWith(_.key <= _.key),但不能使用sortBy(_.key). 因此,显然,从Kto的转换是Key[K]隐式发生的,即使我从未在任何地方声明它,但没有OrderingonKey[K]隐式可用。这里发生了什么?