1

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

这是我的尝试:

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

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

    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不编译。我如何解决它?

4

1 回答 1

1

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]]

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

对于所有地图类型,您都会遇到相同的问题,而您唯一真正的选择是也重新实现RichSortedCollection地图。

于 2016-05-25T02:58:08.270 回答