Gson ライブラリをもう少し Scala フレンドリーにするために、小さなラッパー クラスを作成しようとしています。残念ながら、これを希望どおりに実行しようとすると、コンパイル エラーが発生します。
これは私がこれまでに得たコードです:
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 )
}
}
+
これで、メソッドが Map クラスで定義されているものと一致しないことがわかりました。それが問題です、本当に。+
メソッドが s を受け入れJsonElement
て a を返すようにしたいの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
これについて何かアドバイスはありますか?
アップデート:
以下でも提案されているように、これは私が試したバリエーションの1つです。
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
演算子についての私の理解で>:
は、T は JsonElement の親でなければなりませんが、これは私が探しているものではないと思います。この場合、このマップには JsonElements のインスタンスのみを含めることができるため、JsonElements の親を配置することは適切ではありません。