我想延長:階覆蓋地圖
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)
^
它將與協工種:
scala> class C(val m: List[Any])
defined class C
scala> class D(override val m: List[String]) extends C(m)
defined class D
爲了延長@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
的操作,這對ResponseForJerkson
是非法的,因此它不能延伸Response
。
順便說一句,您可以使用類型參數解決辦法您的問題: '案件級別響應[T](要求:字符串,錯誤:地圖[T,T]);' '案例類ResponseForJerkson(覆蓋VAL要求:字符串,重寫val錯誤:Map [String,String])擴展Response(request,errors)' –