映射存在类型列表

时间:2018-04-05 21:31:22

标签: scala types polymorphism existential-type

我有一个我要映射的存在类型对象的列表。像这样:

sealed abstract class IntBox(val v: Int)
case object IB1 extends IntBox(1)
case object IB2 extends IntBox(2)

case class Adder[A  <: IntBox](ib: A, v: Int) {
  def add(i: A) = v + i.v
}

val adders: List[Adder[_ <: IntBox]] = List(Adder(IB1, 0), Adder(IB2, 0))

adders.map(adder => adder.add(adder.ib))

但是,我收到了像

这样的错误
found: adder.ib.type
required: _$1

我觉得这是因为map以某种方式将不同的IntBox统一为一个无法获得的匿名类型...

我可以在不投标的情况下得到我想要的东西(即adder.asInstanceOf[Adder[adder.ib.type]]...吗?

1 个答案:

答案 0 :(得分:2)

该类型不是无法获得的,您可以使用类型模式匹配来获取它:

adders.map{ case a: Adder[t] => a.add(a.ib) }

这里,existential类型参数绑定到类型变量t,并且编译器可以正确地推断它无法推断出整个列表的t的其他属性。

有关详细信息,请参阅8.3.1 of the Specification部分。

trait替换为class的完整代码,以便进行编译

sealed abstract class IntBox(val v: Int)
case object IB1 extends IntBox(1)
case object IB2 extends IntBox(2)

case class Adder[A  <: IntBox](ib: A, v: Int) {
  def add(i: A) = v + i.v
}

val adders: List[Adder[_ <: IntBox]] = List(Adder(IB1, 0), Adder(IB2, 0))

adders.map{ case a: Adder[t] => a.add(a.ib) }