我正在实现一个数据结构,并希望用户能够使用任何类型作为密钥,只要他提供一个合适的密钥类型包装它。我有这个关键类型的特点。这个想法是从基础到键类型进行隐式转换,另一种方式是(实际上)只使用基类型。这种特点如下:通用特质的隐式转换
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)
,但没有使用sortBy(_.key)
排序Node(key : K, ...)
(下K <% Key[K]
)的序列。因此,显然,从K
到Key[K]
的转换隐含发生,即使它从未在我的任何地方声明过,但在Key[K]
上没有隐含可用的Ordering
。这里发生了什么?
为什么使用Ordered而不是Ordering? – Landei 2011-01-28 14:37:00
由于类型*是*排序的,但*具有*排序。它会有所作为吗?我如何实现一个产生排序的泛型/抽象函数? – Raphael 2011-01-28 14:44:31
我想可能会传递顺序作为`foo`的隐式参数会起作用,但当然这与视图绑定冲突。 – Raphael 2011-01-28 14:54:44