我将在 Scala 中创建 JDBC ResultSet 的包装器。
这个包装器旨在成为一个函数ResultSet => ParticularType
。
问题是我找不到制作 MultiMaps 的通用解决方案。
这是我获取集合的方式:
抽象类 CollectionCreator[C] 扩展 (ResultSet => C) { def apply(rs: ResultSet): C = { 做 { append(rs) } while (rs.next) 返回集合() } def 附加(rs:结果集) def returnCollection(): C }
接下来是地图创建。它是集合创建的一种实现,由于映射非抽象性,它不是抽象的(在我的实现中它总是以 HashMap 为后端)。
在我看来,它应该是这样的:
类 MapCreator[K,IV](keyCreator: ResultSet => K, valueCreator: ResultSet => IV) 扩展 CollectionCreator[Map[K, Place for V]] { 类型 V = IV val middleMap = new HashMap[K, V] 覆盖 def append(rs: ResultSet) { appendToMap(keyCreator(rs), valueCreator(rs)) } def appendToMap(键:K,值:IV){ 中间映射(键)= 值 } 覆盖 def returnCollection(): Map[K,V] = intermediateMap.toMap }
如果可行,我会这样编写 ListMultiMap 创建:
类 ListMultiMapCreator[K,IV](keyCreator: ResultSet => K, valueCreator: ResultSet => IV) 扩展 MapCreator[K, 放置 V](keyCreator, valueCreator) { 覆盖类型 V = List[IV] 覆盖def appendToMap(键:K,值:IV){ 中间映射(键)=中间映射.get(键)匹配{ case Some(values) => values.::(value) 案例无 => 列表(值) } } }
问题是我不能使用V
atPlace for V
因为它当时没有声明。
我觉得抽象类型是很好的解决方案,但不知道如何正确对待它们。
这样的集合创建的正确方法是什么?
我也不确定是否可以覆盖已经在类层次结构中定义的抽象类型。