存在类型之间的映射

时间:2015-07-27 10:29:07

标签: scala types existential-type

我有几个这样的课程:

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之类的情况下表达这一点?

1 个答案:

答案 0 :(得分:4)

解决方案:

重写

s.map(t => new Container(t._1, t._2))

s.map { case (v, x) => new Container(v, x) }

不幸的是,我没有解释为什么前者不起作用。