我有一个类似于struct X {
enum direction { left=’l’, right=’r’ };
int f(int i) { return i==left ? 0 : i==right ? 1 : 2; }
};
void g(X* p) {
direction d; // error: direction not in scope
int i;
i = p->f(left); // error: left not in scope
i = p->f(X::right); // OK
i = p->f(p->left); // OK
// ...
}
的课程。
我有一个特征,可以将这个Pairs
类转换为Json格式。
Pairs
使用此特征时,出现以下错误,为import scala.reflect.ClassTag
import spray.json._
import spray.json.DefaultJsonProtocol
case class Pairs[K, V](key:K, value: V)
trait Convertor[K, V] extends DefaultJsonProtocol{
implicit val convertor = jsonFormat2(Pairs[K, V])
}
val p = Pairs[String, Int]("One", 1)
println(p.toJson)
和K
类型使用了转换器。
错误:找不到类型为证据的隐式值 Convertor.this.JF [K] 隐式val转换器= jsonFormat2(对[K,V]) ^
但是如何将通用数据类型引入范围。有人可以帮助我吗?
答案 0 :(得分:5)
您需要同时为键类型和值类型提供JsonFormat。
此代码
import spray.json.DefaultJsonProtocol._
import spray.json._
case class Pairs[K, V](key: K, value: V)
implicit def pairsFormat[K: JsonFormat, V: JsonFormat] = jsonFormat2(Pairs.apply[K, V])
val p = Pairs[String, Int]("One", 1)
println(p.toJson)
将打印
{"key":"One","value":1}
答案 1 :(得分:1)
K
和V
可以是所有内容(Any
)。由于您没有所有Convertor
的东西,因此必须限制K
和V
。
case class Pairs[K <: PairKey, V <: PairValue](key:K, value: V)
现在,您需要为PairKey
和PairValue
及其所有子项提供转换器。
您可以在这里找到信息:spray-json#jsonprotocol