2012-06-27 147 views
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) 

不工作。

缺少明顯的東西我想?

+1

順便說一句,您可以使用類型參數解決辦法您的問題: '案件級別響應[T](要求:字符串,錯誤:地圖[T,T]);' '案例類ResponseForJerkson(覆蓋VAL要求:字符串,重寫val錯誤:Map [String,String])擴展Response(request,errors)' –

回答

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 
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實例和errors有型Map[String, String],這將是非法的。所以有Response的操作,這對ResponseForJerkson是非法的,因此它不能延伸Response