0

拡張したい:

case class Response(request: String, errors: Map[Any, Any])

より具体的なマップがありますが、これは次のとおりです。

case class ResponseForJerkson(override val request: String, override val errors: Map[String, String]) extends Response(request, errors)

動作していません。

明らかな何かが欠けていると思いますか?

4

2 に答える 2

3

はとMap[A, B]で共変ではないため、明らかにこれを行うことはできません。これを試すだけで、詳細なコンパイル エラーが発生します。AB

scala> class A(val m: Map[Any, Any])
defined class A

scala> class B(override val m: Map[String, String]) extends A(m)
<console>:8: error: type mismatch;
 found   : Map[String,String]
 required: Map[Any,Any]
Note: String <: Any, but trait Map is invariant in type A.
You may wish to investigate a wildcard type such as `_ <: Any`. (SLS 3.2.10)
       class B(override val m: Map[String, String]) extends A(m)
                                                              ^

共変型で機能します。

scala> class C(val m: List[Any])
defined class C

scala> class D(override val m: List[String]) extends C(m)
defined class D
于 2012-06-27T17:48:14.077 に答える
0

@oxbow_lakes の回答を少し拡張するには。「非共変」はMap[String, String]、 のサブタイプではないことを意味しMap[Any, Any]ます。そうでない理由は次のとおりです。

def foo(response: Response) = response.errors.get(0) // legal, because 0 is an Any

しかし、responseが実際に のインスタンスでResponseForJerksonあり、errorstype を持っていた場合Map[String, String]、これは違法になります。Responseしたがって、に対して不正な操作がResponseForJerksonあり、したがって を拡張できませんResponse

于 2012-06-27T22:41:13.487 に答える