【问题标题】:Generically adding implicits to both TreeSet and TreeMaps通常将隐式添加到 TreeSet 和 TreeMaps
【发布时间】:2016-09-22 09:18:57
【问题描述】:

我想为 Scala 中的可变和不可变 TreeMap 和 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. 写我的工具:

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

【问题讨论】:

    标签: scala scala-collections scala-implicits


    【解决方案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]]
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-09
      • 2023-03-06
      • 1970-01-01
      • 2016-10-24
      • 2014-03-31
      • 1970-01-01
      相关资源
      最近更新 更多