我正在实现一个数据结构,并希望用户能够使用任何类型作为键,只要他提供了一个合适的键类型来包装它。我有这种键类型的特征。这个想法是从基类型到键类型进行隐式转换,反之则(实际上)只使用基类型。特征如下所示:
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)
. 因此,显然,从K
to的转换是Key[K]
隐式发生的,即使我从未在任何地方声明它,但没有Ordering
onKey[K]
隐式可用。这里发生了什么?