작은 랩퍼 클래스를 작성하여 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
을 수락하고
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
어떤 조언을?
는 업데이트 :으로는 아래에 제시 한
, 이것이 내가 시도한 변화 중 하나입니다 그러나
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