【发布时间】:2011-01-28 14:11:07
【问题描述】:
我正在实现一个数据结构,并希望用户能够使用任何类型作为键,只要他提供了一个合适的键类型来包装它。我有这种键类型的特征。这个想法是从基类型到键类型进行隐式转换,反之则(实际上)只使用基类型。特征如下所示:
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。或者是否存在,也许使用隐式传递的类清单?考虑到这一点,我找不到任何参考资料。
是否有可能以某种方式静态断言扩展Key[T] 的任何类型都将带有隐式转换T => Key[T]?可悲的是,伴生对象不能有抽象方法。
假设这可行,整个企业是否可行,或者所述用例是否需要多个链式隐式转换? (正如我所读的那样,链接不会发生。)
附录:有了上面的定义,我可以使用sortWith(_.key <= _.key)对Node(key : K, ...)(在K <% Key[K]下)的序列进行排序,但不能使用sortBy(_.key)。所以,很明显,从K 到Key[K] 的转换是隐式发生的,即使我从未在任何地方声明它,但Key[K] 上没有Ordering 隐式可用。这是怎么回事?
【问题讨论】:
-
你为什么使用 Ordered,而不是 Ordering?
-
因为一个类型是有序但有一个有序。它会有所作为吗?如何实现产生 Ordering 的通用/抽象函数?
-
我认为也许将排序作为
foo的隐式参数传递会起作用,但这当然与视图绑定冲突。
标签: scala generics implicit traits