2012-06-27 2 views
0

Я хотел бы расширить:переопределение 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) 

не работает.

Отсутствует что-то очевидное Я думаю?

+1

Кстати, Вы можете обойти проблему, используя параметр типа: 'случай класс Response [T] (запрос: String, ошибки: Карта [T, T]);' 'случай класса ResponseForJerkson (переопределить VAL запрос: String , override val errors: Map [String, String]) расширяет ответ (запрос, ошибки) ' –

ответ

3

Ну, вы явно не можете этого сделать, потому что 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 
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.

Смежные вопросы