我想写一个小的包装类,使Gson library多一点的斯卡拉友好。不幸的是,当我尝试以我想要的方式进行操作时,我遇到了编译错误。斯卡拉:扩展地图和定义+
这是迄今为止我已经得到了代码:
package com.test
import com.google.gson.{JsonObject, JsonElement}
import scala.collection.Iterator
import scala.collection.immutable.Map
case class GsonMap (private val inner: JsonObject = new JsonObject)
extends Map[String, JsonElement] {
/** {@inheritDoc} */
override def iterator: Iterator[(String, JsonElement)]
= new Iterator[(String, JsonElement)] {
private val entries = inner.entrySet.iterator
override def hasNext: Boolean = entries.hasNext
override def next: (String, JsonElement) = {
val elem = entries.next
(elem.getKey, elem.getValue)
}
}
/**
* Returns a clone of the inner JsonObject
*/
private def cloneInner: JsonObject = {
val result = new JsonObject()
iterator.foreach { (item) => result.add(item._1, item._2) }
result
}
/** {@inheritDoc} */
override def + (kv: (String, JsonElement)): GsonMap = {
val cloned = cloneInner
cloned.add(kv._1, kv._2)
GsonMap(cloned)
}
/** {@inheritDoc} */
override def get(key: String): Option[JsonElement]
= Option(inner.get(key))
/** {@inheritDoc} */
override def - (key: String): GsonMap = {
val cloned = cloneInner
cloned.remove(key)
GsonMap(cloned)
}
}
现在,我知道+
方法不匹配是地图类中定义。这就是问题所在,真的。我想+
方法接受JsonElement
s并返回GsonMap
,但我不确定如何使这项工作。我试图在这一点上有一些变化,但没有运气
以供参考,这是编译错误我收到:
[info] Compiling 1 Scala source to target/scala-2.9.2/classes...
[error] src/main/scala/GsonMap.scala:7: class GsonMap needs to be abstract, since method + in trait Map of type [B1 >: com.google.gson.JsonElement](kv: (String, B1))scala.collection.immutable.Map[String,B1] is not defined
[error] case class GsonMap (val inner: JsonObject = new JsonObject)
[error] ^
[error] src/main/scala/GsonMap.scala:31: method + overrides nothing
[error] override def + (kv: (String, JsonElement)): GsonMap = {
[error] ^
[error] two errors found
任何意见,在那里这件事吗?
UPDATE:
正如下面还建议,这是我试过的变化之一:
override def +[T >: JsonElement] (kv: (String, T)): GsonMap = {
val cloned = cloneInner
cloned.add(kv._1, kv._2)
GsonMap(cloned)
}
但是,它也失败了:
[info] Compiling 1 Scala source to target/scala-2.9.2/classes...
[error] /src/main/scala/GSON.scala:33: type mismatch;
[error] found : T
[error] required: com.google.gson.JsonElement
[error] cloned.add(kv._1, kv._2)
[error] ^
[error] one error found
我对>:
运营商的理解是th在T必须是JsonElement的父母,我不认为是我正在寻找的。在这种情况下,此映射只能包含JsonElements的实例,因此放入JsonElements的父项是不合适的。
感谢您的意见!我曾尝试过类似的原创,但没有运气。我更新了我的问题,以包含它和它导致的编译错误。 – Nycto
我添加了一些背景。 – themel
感谢您的帮助和广泛响应。我怀疑是这种情况 – Nycto