如何在Scala中扩展Map?

时间:2012-02-23 10:31:34

标签: scala map scala-collections

我要做的是编写一个扩展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:我注意到现在导致问题的拼写错误:我:>(错误)而不是>:。但我故意不在上面的文字中纠正它,因为它会使问题毫无意义。

2 个答案:

答案 0 :(得分:1)

您考虑过MapProxy了吗? 这已在Scala 2.11上弃用,因此应避免使用此特定解决方案。

无论如何,如果您坚持延长Map并提供其所有API,那么实施+的问题到底是什么?为什么这不起作用?

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

答案 1 :(得分:0)

如果我理解正确,有

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

你不能这样做吗

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

我对你的def -不太确定,如果我理解正确的话,它会返回一张地图,而不是你的地图。如果这样可以,为什么你不能对+做同样的事情?

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