通常向TreeSet和TreeMaps添加含义

时间:2016-05-24 23:58:30

标签: scala scala-collections scala-implicits

我想在Scala中为可变和不可变的TreeMaps和TreeSet添加一些有用的含义。

这是我的尝试:

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

      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
    }
    
  3. 这只能部分起作用:SortedSet#greaterThan编译但TreeMap#greaterThan不编译。我该如何解决?

1 个答案:

答案 0 :(得分:1)

git clone(传递性地)扩展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]] 中的SortedGenTraverableLike的第一个类型参数必须相同,他们不在上面。它们根本不兼容。也就是说,SortedCollection很好,但Repr = TreeMap[A, B]没有意义。

您对所有地图类型都会遇到同样的问题,您唯一真正的选择就是为地图重新实施A = (A, B)