2017-02-06 58 views
2

我有需要是协变的类。这个类包含一个地图,这地图的密钥必须使用相同的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) 

它不会编译,因为地图密钥类型参数是不变的。有这种情况的解决方法吗?

谢谢:)

+0

你熟悉佩奇? –

+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)