2017-02-06 18 views
2

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

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) 

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

Спасибо :)

+0

Вы знакомы с PECS? –

+0

Кажется, нет :) – Loic

ответ

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)