为TreeSet和TreeMap通用地添加隐词



我想在Scala中的可变和不可变TreeMaps和TreeSet中添加一些有用的隐式。

这是我的尝试:

  1. 首先尝试定义具有headOption/lastOption(来自GenTraversableLike)和from/to/until(来自Sorted)的TreeMap和TreeSet的最小上界:

    type SortedCollection[A, Repr <: SortedCollection[A, Repr]] = collection.generic.Sorted[A, Repr] with collection.GenTraversableLike[A, Repr]
    
  2. 编写我的util:

    implicit class RichSortedCollection[A, Repr <: SortedCollection[A, Repr]](s: SortedCollection[A, Repr]) {
    def greaterThanOrEqualTo(a: A): Option[A] = s.from(a).headOption
    def lessThan(a: A): Option[A] = s.until(a).lastOption
    def lessThanOrEqualTo(a: A): Option[A] = s.to(a).lastOption
    }
    

这只能部分工作:SortedSet#greaterThan编译,但TreeMap#greaterThan不编译。我该如何修复它?

TreeMap[A, B](可转换地)扩展了GenTraversableLike[(A, B), TreeMap[A, B]]Sorted[A, TreeMap[A, B]],所以可以说它是一个:

Sorted[A, TreeMap[A, B]] with GenTraversableLike[(A, B), TreeMap[A, B]]

这是对类型别名的关闭,但类型别名SortedCollection中的SortedGenTraverableLike的第一个类型参数必须相同,但它们不在上面。它们根本不兼容。也就是说,Repr = TreeMap[A, B]是好的,但A = (A, B)没有意义。

所有地图类型都会遇到同样的问题,您唯一真正的选择是为地图重新实现RichSortedCollection

相关内容

  • 没有找到相关文章

最新更新