我想寫一個小的包裝類,使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