Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Scala covariant class containg Map (which key in invariant)

Tags:

scala

variance

I have class that needs to be covariant. This class contains a Map, and the key of this map must be use the same T type as my class :

class A
class B extends A

class Container[+T](val content: T) {
  val map : Map[T, _] = Map.empty
}

val c1: Container[A] = new Container[B](new B) // needs to compile (covariant)

It does not compile because Map key type parameter is invariant. Is there a workaround for this kind of situation?

Thanks :)

like image 221
Loic Avatar asked Sep 14 '25 13:09

Loic


1 Answers

Defining a U type like this, it is working :

class A
class B extends A

class Container[+T](val content: T) {
  type U <: T
  val map : Map[U,_] = Map.empty
}

val c1: Container[A] = new Container[B](new B)

Or :

class A
class B extends A

class Container[+T](val content: T) {
    val map : Map[_<: T,_] = Map.empty
}

val c1: Container[A] = new Container[B](new B)
like image 92
Loic Avatar answered Sep 16 '25 05:09

Loic