繁体   English   中英

映射存在类型列表

[英]Mapping over a list of existential types

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

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]]...

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

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

在这里,存在类型参数绑定到类型变量t ,并且编译器可以正确地推断出t其他属性,而t不能为整个列表进行推断。

有关更多详细信息,请参见规范的8.3.1节。


具有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) }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM