【问题标题】:How to extend a Map in Scala?如何在 Scala 中扩展地图?
【发布时间】:2012-03-13 18:01:31
【问题描述】:

我想做的是编写一个扩展Map[DateTime, T] 的自定义类。扩展类将Map[DateTime, T] 作为构造函数参数,并为Map 要实现的每个方法调用所提供映射的相应方法。

我写的没问题

def -(key: DateTime) = iv.-(key)
def get(key: DateTime) = iv.get(key)

但我卡住了

+[B1 :>B](kv: (A, B1)):Map[A, B1]

我打算怎么写?

是不是有一个简单的参考Map 包装器实现可以开始?

PS:不要将其声明为type DtMap[T] = Map[DateTime, T] - 我将不得不将我自己的方法添加到类中。

更新:因此,结果看起来像这样,合并它以便有人能够将其用作他的 Map 扩展的起点(可能解决方案有一些隐藏的问题 - 请让我知道):

case class DtValMap[T](iv: Map[DateTime, T]) extends Map[DateTime, T] {
  def -(key: DateTime) = new DtValMap(iv.-(key))
  def get(key: DateTime) = iv.get(key)
  def +[T1 >: T](kv: (DateTime, T1)): DtValMap[T1] = new DtValMap(iv + kv)
  def iterator: Iterator[(DateTime, T)] = iv.iterator
}

UPDATE2:我注意到现在导致问题的错字:我有:>(错误)而不是>:。但我故意不在上面的文字中更正它,因为这会使问题变得毫无意义。

【问题讨论】:

    标签: scala map scala-collections


    【解决方案1】:

    你考虑过MapProxy吗? 这在 Scala 2.11 上已被弃用,因此应该避免这种特殊的解决方案。

    无论如何,如果您坚持扩展Map 并提供其所有API,那么实现+ 究竟有什么问题?为什么这不起作用?

    def +[B1 >: T](kv: (DateTime, B1)):Map[DateTime, B1] = new YourMap(iv + kv)
    

    【讨论】:

    • 顺便问一下,你能说出MapProxy[A, +B]中的+是什么意思吗?根据您的建议,我现在正在研究MapProxy - 也许它恰好是我的案例的更好解决方案。
    • @Ivan 表示MapProxyB 中是协变的。或者,换句话说,如果CB 的子类型,那么MapProxy[A, C]MapProxy[A, B] 的子类型。如果您有使用 Java 的经验,那么了解所有 Java 泛型都是不变的(即没有此属性)可能会有所帮助,而 Java 的 Array 是协变的。具有讽刺意味的是,碰巧的是,Array 的协变并不是类型声音。
    • 谢谢。顺便说一句,这不是我在您的回答中最初的错字吗?我的意思是不应该是>: 而不是:> 吗?
    • @Ivan 我从你的问题中复制并粘贴了签名,所以如果那里错了,这里就错了。 :-)
    • MapProxy 自 Scala 2.11.0 以来已被弃用,因此您现在应该尽可能避免使用它。
    【解决方案2】:

    如果我理解正确的话,有

    class YourMap[T](iv: Map[DateTime, T]) extends Map[DateTime, T] 
    

    你就不能这样做

    def +[T1 >: T](kv: (DateTime, T1)): YourMap[T1] = new YourMap(iv + kv)
    

    我不太确定您的def -,如果我理解正确,它返回的是地图,而不是 YourMap。如果这没问题,为什么你不能对+ 做同样的事情?

    type DtMap[T] 的行中,您是否考虑过使用 pimp my library 添加方法,而不是使用类扩展?集合类很复杂,扩展它们也是如此。

    【讨论】:

    • 我无法理解所有的复杂性。我能感觉到 + 论证的意思,但我不完全知道 :> 是什么。我返回了Map,因为我不知道如何编写它来返回YourMap。 “皮条客我的图书馆”怎么样 - 我不确定这种方法是否足以满足图书馆的主要基本类型。
    • 顺便说一句,+ 仍然不能这样工作:wrong number of type argumentsnot found: type Anot found: type B
    • 抱歉,有点太快了。固定
    • >: 并不复杂,只需要你查一下即可。
    • @Ivan 查看 symbolhound.com 以搜索符号。否则你可以检查 scala 参考:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    • 2020-02-21
    • 1970-01-01
    相关资源
    最近更新 更多