我有几个这样的课程:
class Value[T]
class Container[T](v: Value[T], x: T)
现在我想将(Value[T], T)
s序列转换为Container[T]
s序列,其中T
序列的每个元素可以不同。这种类型可以用存在表达:
def mapContainer(s: Seq[(Value[T], T) forSome {type T}]): Seq[Container[T] forSome {type T}]
然而,似乎我无法写出这个功能的主体。我天真的尝试失败了:
def mapContainer(s: Seq[(Value[T], T) forSome {type T}]) =
s.map(t => new Container(t._1, t._2))
错误如下所示:
[error] found : Value[T]
[error] required: Value[Any]
[error] Note: T <: Any, but class Var is invariant in type T.
我无法使Value
协变,无论如何,我认为这不是正确的解决方案。
话虽如此,我对结果类型Seq[Container[_]]
也很好,但我也找不到方法来获得它。
是否可以在不诉诸asInstanceOf
之类的情况下表达这一点?
答案 0 :(得分:4)
解决方案:
重写
s.map(t => new Container(t._1, t._2))
到
s.map { case (v, x) => new Container(v, x) }
不幸的是,我没有解释为什么前者不起作用。