映射存在类型列表
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: _
我觉得这有点像,因为 map
以某种方式将不同的 IntBox
统一为一种无法获得的匿名类型...
我可以在不转换的情况下得到我想要的东西吗(即adder.asInstanceOf[Adder[adder.ib.type]]...
?
类型不是不可获取的,可以使用类型模式匹配获取:
adders.map{ case a: Adder[t] => a.add(a.ib) }
此处,存在类型参数绑定到类型变量 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) }
我有一个要映射的存在类型对象列表。像这样:
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: _
我觉得这有点像,因为 map
以某种方式将不同的 IntBox
统一为一种无法获得的匿名类型...
我可以在不转换的情况下得到我想要的东西吗(即adder.asInstanceOf[Adder[adder.ib.type]]...
?
类型不是不可获取的,可以使用类型模式匹配获取:
adders.map{ case a: Adder[t] => a.add(a.ib) }
此处,存在类型参数绑定到类型变量 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) }