Scala ковариантный класс, связывающийся с картой (который является инвариантом)

У меня есть класс, который должен быть ковариантным. Этот класс содержит карту, и ключ этой карты должен использовать тот же тип T, что и мой класс:

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)

Он не компилируется, поскольку параметр типа ключа карты является инвариантным. Есть ли обходной путь для такой ситуации?

Спасибо:)

1 ответ

Определяя тип U следующим образом, он работает:

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)

Или же:

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)
Другие вопросы по тегам