覆盖映射的scala

覆盖映射的scala,scala,Scala,我想延长: 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) 它不起作用了 我认为遗漏了一些明显的东西?好吧,你显然不能这样做,因

我想延长:

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)
它不起作用了


我认为遗漏了一些明显的东西?

好吧,你显然不能这样做,因为
Map[A,B]
A
B
中是不协变的。只是尝试一下,就会出现一个详细的编译错误:

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)
                                                              ^

显然,你不能这样做,因为
Map[A,B]
A
B
中是不协变的。只是尝试一下,就会出现一个详细的编译错误:

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)
                                                              ^

将@oxbow_lakes的答案扩展一点。“非协变”表示
Map[String,String]
不是
Map[Any,Any]
的子类型。你可以看到为什么它不是:

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

但是如果
response
实际上是
ResponseForJerkson
的一个实例,并且
errors
具有类型
Map[String,String]
,这将是非法的。因此,
Response
上的操作对于
responseForkerkson
是非法的,因此它不能扩展
Response

来稍微扩展@oxbow\u lakes的答案。“非协变”表示
Map[String,String]
不是
Map[Any,Any]
的子类型。你可以看到为什么它不是:

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

但是如果
response
实际上是
ResponseForJerkson
的一个实例,并且
errors
具有类型
Map[String,String]
,这将是非法的。因此,
Response
上的操作对于
ResponseForJerkson
是非法的,因此它不能扩展
Response

顺便说一句,您可以使用类型参数解决问题:
case-class-Response[t](请求:字符串,错误:Map[t,t])
案例类响应forjerkson(覆盖val请求:字符串,覆盖val错误:Map[String,String])扩展响应(请求,错误)
顺便说一句,您可以使用类型参数解决问题:
案例类响应[T](请求:字符串,错误:Map[T,T])
案例类响应Forjerkson(覆盖val请求:字符串,覆盖val错误:映射[String,String])扩展响应(请求,错误)