我想用一个具体的实现IntIntMap扩展Scala的MapLike特性。为此,我需要实现以下方法,
def get(key: A): Option[B]
def iterator: Iterator[(A, B)]
def + [B1 >: B](kv: (A, B1)): This
def -(key: A): This
This
类型是什么?我的重写方法签名应该是,
override def +=(kv: (Int, Int)): IntIntMap = {
// logic
}
或只是scala.reflect.This
?课程定义怎么样?应该是吗,
class IntIntMap(...) extends MapLike[Int,Int,This] { ... }
还是别的什么呢?
答案 0 :(得分:5)
您应该延长MapLike[Int, Int, IntIntMap]
,This
变为IntIntMap
。
答案 1 :(得分:2)
您应首先查看The Architecture of Scala Collections。它向您展示了如何集成您自己的集合。
但是,在您的示例中,您将无法实现+
方法,因为它应该允许添加与超类型Int匹配的值并返回适当的Map
。由于This
应为Map[Int,Int]
,您将遇到麻烦。
我宁愿建议在某处使用类型定义:
type MapIntInt = Map[Int,Int]
并最终使用implicits来带来特定的方法。
答案 2 :(得分:1)
不是保留字,不是某个类的名称,而是MapLike中的第三个类型参数。
类型声明为MapLike[K, +V, +This <: MapLike[K, V, This]
。它可以被任何其他方式调用。大多数情况下,这应该是实际的实现者类,因此名称。在你的情况下
class IntIntMap extends MapLike [Int, Int, IntIntMap].
如果没有该参数,+
结果类型将被声明为MapLike,而不是IntIntMap。在+
上,这不会有问题,因为您必须定义它,并且这样做可以更改结果类型。但是,您不需要重新定义以及使用+
实现的方法(例如++
)仍将返回MapLike。